Multiple [SQLITE_BUSY] The database file is locked errors during market transactions
Occurred when many players traded simultaneously
Caused transaction failures and poor user experience
Root Cause:
SQLite busy_timeout was set to 5 seconds
High concurrency in market transactions exceeded timeout
Default configuration not optimized for multi-player servers
Solution:
Increased SQLite busy_timeout from 5s → 15s (3x improvement)
Applied in both JDBC URL and PRAGMA connection init
Maintains WAL mode for better concurrent access
Testing:
Load tested with 10+ concurrent market transactions
Lock errors reduced by ~90%
Recommended migration to MySQL for servers with 50+ players
#2: Bedrock Edition GUI Incompatibility Issue:
Bedrock players reported "blocks staying in inventory" when using Market GUI
Items from chest-based GUIs appeared as real items in inventory
Bedrock Edition doesn't support interactive chest GUIs like Java Edition
Root Cause:
All GUIs used Bukkit.createInventory() (chest-based GUIs)
Minecraft Bedrock Edition interprets chest GUI items as real items
No Bedrock-native interface (Geyser Forms) implemented
Solution - (Market GUI):
1. Geyser Forms API Integration:
Added BedrockFormsManager with full reflection support
Uses Geyser's native SimpleForm and ModalForm APIs
Zero compile-time dependency - loads dynamically at runtime
2. Intelligent Platform Detection:
Detects Bedrock players via Floodgate API (reflection)
Checks if Geyser Forms API is available
Auto-switches between Forms (Bedrock) and Chest GUIs (Java)
3. Fallback System:
Code (Java):
Bedrock Player
+ Geyser Installed →
Native Forms
(✅ Fixed
) Bedrock Player
+ No Geyser → Chest GUI
(⚠️ Known issue
) Java Edition Player → Chest GUI
(✅ Works
)
4. ALL GUIs Now Support Bedrock Forms:
MarketGUI:
Buy items (1x, 16x, stack)
Sell items (1x, stack, all)
Create market listings
Touch-friendly item selection
BankGUI:
Deposit money (100,500, 1�,5K, $10K)
Withdraw money (same amounts)
Check balance in real-time
Automatic menu refresh after transactions
LoansGUI:
Request loans (1�,2.5K, 5�,10K, $25K)
Confirmation dialog with offer details
Make payments (500,1K, 2.5�,5K, full amount)
View loan status
Smart credit score integration
ProfessionsGUI:
Select from 7 professions
View buy/sell factors
Real-time XP and level display
All Forms Include:
Full translation support (EN/ES)
Touch-friendly Bedrock UX
Graceful fallback to chest GUIs if Geyser unavailable
Automatic platform detection
Installation Requirements:
Geyser-Spigot plugin (optional but recommended)
Floodgate plugin (optional but recommended)
Auto-detects at runtime - no configuration needed
Current Status:
✅ MarketGUI - Full Geyser Forms support
✅ BankGUI - Full Geyser Forms support (NEW)
✅ LoansGUI - Full Geyser Forms support (NEW)
✅ ProfessionsGUI - Full Geyser Forms support (NEW)
Technical Improvements Dependency Management
Geyser/Floodgate APIs loaded via reflection (no compile dependency)
Dependencies marked as provided and optional in pom.xml
Dependencies commented out in pom.xml for easier compilation
Zero JAR size increase - maintains 2.5MB optimized build
Graceful degradation when APIs not available
Bedrock Forms Architecture
SimpleForm - Menu with buttons (main menus, selections)
Fixed: hard blockers on market buys/sells/orders when unit price or totals are zero/negative; cache and price calculator now auto-heal corrupt prices back to safe base values so items can’t be bought for free.
Improved: economy operations now require strictly positive amounts, tightening validation across transfers/debits.
Compatibility: Java 17+, Spigot/Paper/Purpur/Folia 1.19.4–1.21.9+ (no API changes).
Update: build or download EcoXpert-1.2.2.jar, replace the old JAR in plugins/, and restart your server. No config changes required.
Fixed: schema creation now generates valid MySQL DDL (AUTO_INCREMENT, booleans, compatible defaults) and uses dialect-specific upsert logic to avoid syntax errors during startup.
Improved: database initialization chooses the correct SQL dialect (SQLite/MySQL/H2), verifies index existence via metadata, and handles meta-version updates without driver-specific queries.
Fixed: MySQL charset compatibility — added automatic fallback from utf8mb4 to utf8 if server doesn't support utf8mb4. Database is now auto-created if it doesn't exist.
Improved: config.yml now includes MySQL troubleshooting guide with solutions for charset, timeout, and access errors.