c3p0是一個基於JNDI-bindable DataSources(使用DriverManager-based)的很容易使用的JDBC驅動函數庫。
所以在使用c3p0時,還需要一個JDBC的Driver,才能使用,而c3p0的作用只是控制Database的Connection使用,舉個簡單的例子,當Connection被DataBase Server timeout斷線後,c3p0會自動多次去重新連線,避免程式就直接丟出SQLException。
這次剛好遇到Microsoft SQL Server 2005不知為何一直丟出以下訊息,才去找到c3p0來使用的,發生的原因似乎是SQL Server本身對JDBC的Connection TimeOut斷線、或是Connection數不夠。
I/O Error: Connection reset
I/O Error: Software caused connection abort: recv failed
下面是一個範例,結果如下圖:
package com.yslifes; import java.beans.PropertyVetoException; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class DB { private static ComboPooledDataSource ds = null; public static DataSource getPool() throws java.sql.SQLException { //com.mysql.jdbc.jdbc2.optional. ds = null; if(ds==null) { ds = new ComboPooledDataSource(); try { ds.setDriverClass( "net.sourceforge.jtds.jdbc.Driver" ); } catch (PropertyVetoException e) { e.printStackTrace(); throw new java.sql.SQLException(e.getMessage()); } //loads the jdbc driver ds.setJdbcUrl( "jdbc:jtds:sqlserver://localhost:1433/master" ); ds.setUser("sa"); ds.setPassword("admin123"); /*ds.setIdleConnectionTestPeriod(30); ds.setNumHelperThreads(10); ds.setUnreturnedConnectionTimeout(600); ds.setMaxIdleTime(30); */ } return ds; } public static java.sql.Connection getConnection() throws java.sql.SQLException { return getPool().getConnection(); } public static void main(String args[]) throws SQLException { java.sql.Connection con = DB.getConnection(); con.close(); } }