|
9 | 9 | import lombok.Getter; |
10 | 10 | import lombok.Setter; |
11 | 11 |
|
| 12 | +/** |
| 13 | + * Manages a HikariCP-backed SQL connection pool for MySQL/MariaDB/PostgreSQL. |
| 14 | + * |
| 15 | + * Supports a failover mode where if {@link DbType#MARIADB} is selected but the MariaDB JDBC |
| 16 | + * driver is not present, it will automatically fall back to the MySQL driver. |
| 17 | + */ |
12 | 18 | public class ConnectionManager { |
13 | 19 |
|
14 | 20 | @Getter |
@@ -94,6 +100,14 @@ public class ConnectionManager { |
94 | 100 | @Setter |
95 | 101 | private DbType dbType = DbType.MYSQL; |
96 | 102 |
|
| 103 | + /** |
| 104 | + * If true and {@link DbType#MARIADB} is selected, but the MariaDB driver is not present, |
| 105 | + * fall back to using the MySQL driver automatically. |
| 106 | + */ |
| 107 | + @Getter |
| 108 | + @Setter |
| 109 | + private boolean mariadbFallbackToMysqlDriver = true; |
| 110 | + |
97 | 111 | public ConnectionManager(String host, String port, String username, String password, String database) { |
98 | 112 | this.host = host; |
99 | 113 | this.port = port; |
@@ -143,29 +157,54 @@ private void ensureDriverPresent(String className) throws ClassNotFoundException |
143 | 157 | Class.forName(className); |
144 | 158 | } |
145 | 159 |
|
| 160 | + /** |
| 161 | + * Resolves the JDBC driver class to use. |
| 162 | + * |
| 163 | + * Behavior: |
| 164 | + * - If {@link #mysqlDriver} is explicitly set, that driver must be present and is used. |
| 165 | + * - Otherwise, uses the driver implied by {@link #dbType}. |
| 166 | + * - If {@link DbType#MARIADB} is selected and the MariaDB driver isn't present, optionally falls back to the MySQL driver. |
| 167 | + * |
| 168 | + * @return The resolved driver class name. |
| 169 | + * @throws ClassNotFoundException if no suitable driver is available. |
| 170 | + */ |
146 | 171 | private String resolveDriver() throws ClassNotFoundException { |
147 | 172 | // Allow explicit override (keeps field name mysqlDriver for minimal churn) |
148 | 173 | if (mysqlDriver != null && !mysqlDriver.isEmpty()) { |
149 | 174 | ensureDriverPresent(mysqlDriver); |
150 | 175 | return mysqlDriver; |
151 | 176 | } |
152 | 177 |
|
153 | | - String className; |
154 | 178 | switch (dbType) { |
155 | 179 | case POSTGRESQL: |
156 | | - className = "org.postgresql.Driver"; |
157 | | - break; |
| 180 | + ensureDriverPresent("org.postgresql.Driver"); |
| 181 | + return "org.postgresql.Driver"; |
158 | 182 | case MARIADB: |
159 | | - className = "org.mariadb.jdbc.Driver"; |
160 | | - break; |
| 183 | + return resolveMariaDbWithFallback(); |
161 | 184 | case MYSQL: |
162 | 185 | default: |
163 | | - className = "com.mysql.cj.jdbc.Driver"; |
164 | | - break; |
| 186 | + ensureDriverPresent("com.mysql.cj.jdbc.Driver"); |
| 187 | + return "com.mysql.cj.jdbc.Driver"; |
165 | 188 | } |
| 189 | + } |
166 | 190 |
|
167 | | - ensureDriverPresent(className); |
168 | | - return className; |
| 191 | + /** |
| 192 | + * Resolves MariaDB driver with optional fallback to MySQL driver if MariaDB driver is missing. |
| 193 | + * |
| 194 | + * @return Driver class name to use. |
| 195 | + * @throws ClassNotFoundException if neither MariaDB nor fallback MySQL driver is present. |
| 196 | + */ |
| 197 | + private String resolveMariaDbWithFallback() throws ClassNotFoundException { |
| 198 | + try { |
| 199 | + ensureDriverPresent("org.mariadb.jdbc.Driver"); |
| 200 | + return "org.mariadb.jdbc.Driver"; |
| 201 | + } catch (ClassNotFoundException e) { |
| 202 | + if (!mariadbFallbackToMysqlDriver) { |
| 203 | + throw e; |
| 204 | + } |
| 205 | + ensureDriverPresent("com.mysql.cj.jdbc.Driver"); |
| 206 | + return "com.mysql.cj.jdbc.Driver"; |
| 207 | + } |
169 | 208 | } |
170 | 209 |
|
171 | 210 | private String buildJdbcUrl(String driverClassName) { |
|
0 commit comments