本文提供一個通用的 Java 資料庫連線工具類 DBUtil,支援 MySQL、Oracle、SQL Server 等主流資料庫。核心基於 Apache Commons DBCP 連線池與 DbUtils 查詢輔助,內建連線保活機制,適合作為專案基礎設施元件。
GenericObjectPool 實作ResultSet → List<Map<String, Object>>select 1 防止連線斷開commons-dbcp-1.4.jar commons-dbutils-1.3.jar commons-pool-1.5.4.jar
下載連結:依賴包下載
public DBUtil(String dri, String url, String userName, String password, String poolName) {
this.dri = dri;
this.url = url;
this.username = userName;
this.password = password;
this.poolName = poolName;
}
常見資料庫配置範例:
| 資料庫 | 驅動類名 | 連線 URL 範例 |
|---|---|---|
| MySQL | com.mysql.jdbc.Driver | jdbc:mysql://host:3306/db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8 |
| Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@host:1521:sid |
| SQL Server | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://host:1433;DatabaseName=db |
private void StartPool() {
Class.forName(dri);
if (connectionPool != null) ShutdownPool();
connectionPool = new GenericObjectPool(null);
ConnectionFactory cf = new DriverManagerConnectionFactory(url, username, password);
PoolableConnectionFactory pcf = new PoolableConnectionFactory(
cf, connectionPool, null, "SELECT 1", false, true);
Class.forName("org.apache.commons.dbcp.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager
.getDriver("jdbc:apache:commons:dbcp:");
driver.registerPool(poolName, pcf.getPool());
queryThread = new QueryThread(this);
queryThread.start();
}
// 更新操作
public int execute(String sql, Object[] params) throws Exception {
Connection conn = getConnection();
try {
return new QueryRunner().update(conn, sql, params);
} finally { Close(conn); }
}
// 查詢操作
public List<Map<String, Object>> query(String sql) throws SQLException {
Connection conn = getConnection();
try {
return new QueryRunner().query(conn, sql, new MapListHandler());
} finally { Close(conn); }
}
class QueryThread extends Thread {
private DBUtil dbUtil;
private boolean startQuery = true;
public void run() {
while (true) {
try {
if (startQuery) dbUtil.query("select 1");
} catch (Exception e) { e.printStackTrace(); }
finally {
try { Thread.sleep(120000); }
catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
public void setStartQuery(boolean flag) { this.startQuery = flag; }
}
// MySQL 範例
DBUtil mysql = new DBUtil(
"com.mysql.jdbc.Driver",
"jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8",
"root", "123456", "mysql_pool"
);
// Oracle 範例
DBUtil oracle = new DBUtil(
"oracle.jdbc.driver.OracleDriver",
"jdbc:oracle:thin:@192.168.1.100:1521:ORCL",
"scott", "tiger", "oracle_pool"
);
// 通用操作
List<Map<String, Object>> users = mysql.query("SELECT * FROM users WHERE status = ?", 1);
int affected = oracle.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", new Object[]{100, 1});
此工具類展示了傳統 Java 專案中資料庫存取層的完整封裝,從連線池建立、SQL 執行到連線保活,提供了可直接落地的參考實作。雖然依賴庫版本較舊,但其架構設計思路對理解連線池原理與防止連線超時策略仍具教學價值。