package db;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DBPool {
private ComboPooledDataSource dataSource;
public static Connection con;
public DBPool() {
try {
dataSource = new ComboPooledDataSource();
dataSource.setUser("test");
dataSource.setPassword("test");
dataSource.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl");
dataSource.setDriverClass("oracle.jdbc.driver.OracleDriver");
dataSource.setInitialPoolSize(2);
dataSource.setMinPoolSize(1);
dataSource.setMaxPoolSize(10);
dataSource.setMaxStatements(50);
dataSource.setMaxIdleTime(60);
dataSource.setAcquireRetryAttempts(3);
} catch (PropertyVetoException e) {
}
}
public final static DBPool getInstance() {
return new DBPool();
}
public final Connection getConnection() {
try {
return dataSource.getConnection();
} catch (SQLException e) {
return null;
}
}
//測試方法
public static void main(String[] args) throws SQLException {
con = DBPool.getInstance().getConnection();
System.out.println(con);
try {
if (con != null){con.close();}
} catch (SQLException e) {
e.printStackTrace();
}
}
} //初始化時獲取三個連接,取值應在minPoolSize與maxPoolSize之間。Default: 3 initialPoolSize
cpds.setInitialPoolSize(initialPoolSize);
//連接池中保留的最大連接數。Default: 15 maxPoolSize
cpds.setMaxPoolSize(maxPoolSize);
//連接池中保留的最小連接數。
cpds.setMinPoolSize(minPoolSize);
//獲得連接的最大等待毫秒數。Default: 1000 acquireRetryDelay
cpds.setAcquireRetryDelay(acquireRetryDelay);
//最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0 maxIdleTime
cpds.setMaxIdleTime(maxIdleTime);
//當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 acquireIncrement
//cpds.setAcquireIncrement(3);
//每60秒檢查所有連接池中的空閑連接。Default: 0 idleConnectionTestPeriod
//cpds.setIdleConnectionTestPeriod(60);
//連接關閉時默認將所有未提交的操作回滾。Default: false autoCommitOnClose
//cpds.setAutoCommitOnClose(true);
//JDBC的標準參數,用以控制數據源內加載的PreparedStatements數量。但由于預緩存的statements屬于單個connection而不是整個連接池。所以設置這個參數需要考慮到多方面的因素。如果maxStatements與maxStatementsPerConnection均為0,則緩存被關閉。Default: 0
//cpds.setMaxStatements(1);
//maxStatementsPerConnection定義了連接池內單個連接所擁有的最大緩存statements數
//cpds.setMaxStatementsPerConnection(100);
//定義所有連接測試都執行的測試語句。在使用連接測試的情況下這個一顯著提高測試速度。注意:測試的表必須在初始數據源的時候就存在。Default: null preferredTestQuery
//cpds.setPreferredTestQuery("select sysdate from dual");
// 因性能消耗大請只在需要的時候使用它。如果設為true那么在每個connection提交的
// 時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
// 等方法來提升連接測試的性能。Default: false testConnectionOnCheckout
//cpds.setTestConnectionOnCheckout(true);
//如果設為true那么在取得連接的同時將校驗連接的有效性。Default: false testConnectionOnCheckin
//cpds.setTestConnectionOnCheckin(true);
//定義在從數據庫獲取新連接失敗后重復嘗試的次數。Default: 30 acquireRetryAttempts
//cpds.setAcquireRetryAttempts(30);
//獲取連接失敗將會引起所有等待連接池來獲取連接的線程拋出異常。但是數據源仍有效
//保留,并在下次調用getConnection()的時候繼續嘗試獲取連接。如果設為true,那么在嘗試
//獲取連接失敗后該數據源將申明已斷開并永久關閉。Default: false breakAfterAcquireFailure
//cpds.setBreakAfterAcquireFailure(false);
//兩次連接中間隔時間,單位毫秒。Default: 1000 acquireRetryDelay
cpds.setAcquireRetryDelay(60000);
java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.getClob(異常解決辦法
最近遇到了一個頭痛的問題,可能大家也遇到過。經過多番的詢問與查找,終于知道問題原因的所在:異常內容如下:
java.lang.AbstractMethodError: oracle.jdbc.driver.OracleResultSetImpl.getClob(Ljava/lang/String;)Ljava/sql/Clob;
問題原因:Oracle驅動版本不對
解決辦法:在Oracle服務器上找到這個驅動,然后cp到Apache的lib目錄下,并同是修改環境變量classpath,保證這個lib/classes12.jar在最前面;修改完后,重新啟動服務,問題就可以解決。
(ojdbc14.jar在classes12.jar前面)