資料庫連接池代碼
1. 誰能給我發一段完整的資料庫連接池代碼
資料庫連接是最常用的提高性能的方法,總結了一下:1 定義資料庫訪問介面public interface IDatabaseConnection
{
public abstract Connection createConnection();
public abstract void closeConnection(Connection conn);
}2 實現該介面2.1 直接連接,連接速度較慢,用戶量較大時資源佔用很大public Connection createConnection()
{
try
{
SystemParameter SP = new SystemParameter();
Class.forName(DBDRIVER).newInstance();
Connection con =
DriverManager.getConnection(
DBDRIVER_URL,
DBUSER,
DBPASSWORD);
return con;
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
return null;
}
catch (sqlException e)
{ e.printStackTrace();
return null;
}
catch (InstantiationException e)
{ e.printStackTrace();
return null;
}
catch (IllegalAccessException e)
{ e.printStackTrace();
return null;
}
}
public void closeConnection(Connection conn)
{
if(conn!=null) try
{
conn.close();
}
catch (SQLException e)
{
e.printStackTrace();
} }2.2 DBConnectionManager、DBConnectionPool方式這個連接池是網上比較多的連接池代碼public class DBConnectionManager
{
static private DBConnectionManager instance; /*唯一實例*/
static private int clients;
/*該計數代表引用DBConnectionManager唯一實例的客戶程序總數,
它將被用於控制連接池的關閉操作 */
//Added by leo on 2001-5-23
static private String DEFAULTCONNECTIONPOOL = "homepage"; private Vector drivers = new Vector();
private PrintWriter logPrint;
private Hashtable pools = new Hashtable();
private SystemParameter sp = new SystemParameter();
/**
返回唯一實例。如果是第一次調用此方法,則創建實例
*/
static synchronized public DBConnectionManager getInstance()
{
if (instance == null)
{
instance = new DBConnectionManager();
}
clients++;
return instance;
} /**
建構函數私有以防止其它對象創建本類實例
*/
public DBConnectionManager()
{
init();
} /** Added by leo on 2001-5-23
使用默認的連接池名,創建並返回新連接
*
* @return Connection 可用連接或null
*/
public Connection getConnection()
{
return getConnection(DEFAULTCONNECTIONPOOL);
} /**
獲得一個可用的(空閑的)連接.如果沒有可用連接,且已有連接數小於最大連接數
限制,則創建並返回新連接
*
* @param name 在屬性文件中定義的連接池名字
* @return Connection 可用連接或null
*/
public Connection getConnection(String name)
{
DBConnectionPool pool = (DBConnectionPool) pools.get(name);
if (pool != null)
{
return pool.getConnection();
}
return null;
} /**
獲得一個可用連接.若沒有可用連接,且已有連接數小於最大連接數限制,
則創建並返回新連接.否則,在指定的時間內等待其它線程釋放連接.
*
* @param name 連接池名字
* @param time 以毫秒計的等待時間
* @return Connection 可用連接或null
*/
public Connection getConnection(String name, long time)
{
DBConnectionPool pool = (DBConnectionPool) pools.get(name);
if (pool != null)
{
return pool.getConnection(time);
}
return null;
} /** Added by leo on 2001-5-23
將連接對象返回給默認的連接池
*
* @param con 連接對象
*/
public void freeConnection(Connection con)
{
String name = DEFAULTCONNECTIONPOOL;
freeConnection(name, con);
} /**
將連接對象返回給由名字指定的連接池
*
* @param name 在屬性文件中定義的連接池名字
* @param con 連接對象
*/
public void freeConnection(String name, Connection con)
{
DBConnectionPool pool = (DBConnectionPool) pools.get(name);
if (pool != null)
{
pool.freeConnection(con);
}
} /**
關閉所有連接,撤銷驅動程序的注冊
*/
public synchronized void release()
{ // 等待直到最後一個客戶程序調用
if (--clients != 0)
{
return;
}
Enumeration allPools = pools.elements();
while (allPools.hasMoreElements())
{
DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();
pool.release();
}
Enumeration allDrivers = drivers.elements();
while (allDrivers.hasMoreElements())
{
Driver driver = (Driver) allDrivers.nextElement();
try
{
DriverManager.deregisterDriver(driver);
log("撤消JDBC驅動程序" + driver.getClass().getName() + "的注冊");
}
catch (SQLException e)
{
log(e, "無法撤消下列JDBC驅動程序的注冊" + driver.getClass().getName());
}
}
} /**
根據指定屬性創建連接池實例.
*
* @param props 連接池屬性
*/
private void createPools()
{
String poolName = sp.DBPOOLNAME;
String url = sp.DBDRIVER_URL;
String user = sp.DBUSER;
String password = sp.DBPASSWORD;
int max = sp.DBMAXCONN;
DBConnectionPool pool =
new DBConnectionPool(poolName, url, user, password, max);
pools.put(poolName, pool);
log("成功創建連接池" + poolName); } /**
讀取屬性完成初始化
*/
private void init()
{ logPrint=new PrintWriter(System.out);
loadDrivers();
createPools();
} /**
裝載和注冊所有JDBC驅動程序
*
* @param props 屬性
*/
private void loadDrivers()
{
String driverClassName = sp.DBDRIVER;
try
{
Driver driver =
(Driver) Class.forName(driverClassName).newInstance();
DriverManager.registerDriver(driver);
drivers.addElement(driver);
log("成功JDBC注冊驅動程序" + driverClassName);
}
catch (Exception e)
{
log("無法注冊JDBC驅動程序;" + driverClassName + ",錯誤:" + e);
}
} /**
將文本信息寫入日誌文件
預設為packaged
*/
void log(String msg)
{
logPrint.println(new java.util.Date() + ": " + msg);
} /**
將文本信息與異常寫入日誌文件
*/
void log(Throwable e, String msg)
{
logPrint.println(new java.util.Date() + ": " + msg);
e.printStackTrace(logPrint);
}}------------------------------------------------------class DBConnectionPool
{
private int checkedOut;
private PrintWriter logPrint;
private Vector freeConnections = new Vector();
private int maxConn;
private String name;
private String password;
private String URL;
private String user; /**
創建新的連接池
*@param name 連接池名字
*@param URL 資料庫的JDBC URL
*@param user 資料庫帳號,或null
*@param password 密碼,或null
*@param maxConn 此連接池允許建立的最大連接數
*/
public DBConnectionPool(String name, String URL, String user, String password, int maxConn)
{
this.name = name;
this.URL = URL;
this.user = user;
this.password = password;
this.maxConn = maxConn;
logPrint = new PrintWriter(System.out);
} /**
將不再使用的連接返回給連接池
*@param con 客戶程序釋放的連接
*/
public synchronized void freeConnection(Connection con)
{
freeConnections.addElement(con);
checkedOut--;
notifyAll();
} /**
從連接池獲得一個可用連接,如沒有空閑的連接且當前連接數小於最大連接數,則創建新連接,
如原來登記為可用的連接不再有效,則從向量刪除之,然後遞歸調用自己以嘗試新的可用連接
*/
public synchronized Connection getConnection()
{
Connection con = null;
if(freeConnections.size() > 0)
{// 獲取向量中第一個可用連接
con = (Connection)freeConnections.firstElement();
freeConnections.removeElementAt(0);
try
{
if(con.isClosed())
{
log("從連接池" + name + "刪除一個無效連接");
con = getConnection();
}
}
catch(SQLException e)
{
log("從連接池" + name + "刪除一個無效連接");
con = getConnection();
}
}
else if(maxConn == 0 || checkedOut < maxConn)
{
con = newConnection();
}
if(con != null)
{
checkedOut++;
}
return con;
} /**
從連接池獲取可用連接,可以指定客戶程序能夠等待的最長時間
*@param timeout 以毫秒計的等待時間限制
*/
public synchronized Connection getConnection(long timeout)
{
long startTime = new Date().getTime();
Connection con;
while((con = getConnection()) == null)
{
try
{
wait(timeout);
}
catch(InterruptedException e){}
if((new Date().getTime() - startTime) >= timeout)
{
return null;
}
}
return con;
} /**
關閉所有連接
*/
public synchronized void release()
{
Enumeration allConnections = freeConnections.elements();
while(allConnections.hasMoreElements())
{
Connection con = (Connection)allConnections.nextElement();
try
{
con.close();
log("關閉連接池" + name + "中的一個連接");
}
catch(SQLException e)
{
log(e, "無法關閉連接池" + name + "中的連接");
}
}
freeConnections.removeAllElements();
} /**
創建新的連接
*/
private Connection newConnection()
{
Connection con = null;
try
{
if(user == null)
{
con = DriverManager.getConnection(URL);
}
else
{
con = DriverManager.getConnection(URL, user, password);
}
log("連接池" + name + "創建一個新的連接");
}
catch(SQLException e)
{
log(e, "無法創建下列URL的連接" + URL);
return null;
}
return con;
} /**
將文本信息寫入日誌文件
預設為packaged
*/
void log(String msg)
{
logPrint.println(new Date() + ": " + msg);
} /**
將文本信息與異常寫入日誌文件
*/
void log(Throwable e, String msg)
{
logPrint.println(new Date() + ": " + msg);
e.printStackTrace(logPrint);
}
}
---------------------------------DBConnectionManager connMgr = DBConnectionManager.getInstance();
public Connection createConnection()
{ Connection dBConn = connMgr.getConnection(new SystemParameter().DBPOOLNAME);
return dBConn;
} public void closeConnection(Connection conn)
{
connMgr.freeConnection(new SystemParameter().DBPOOLNAME, conn);
connMgr.release(); }
經過測試,使用這種方法,會造成資料庫大量死鎖,證明該連接池實現方法存在隱患也可能是因為它不屬於webserver容器自身的,不具有可管理性。2.3 tomcat連接池public Connection createConnection()
{ try
{
Context initCtx = new InitialContext();
DataSource ds;
ds = (DataSource) initCtx.lookup("java:comp/env/"+new SystemParameter().JDBC_SOURCE);
return ds.getConnection();
}
catch (NamingException e)
{ e.printStackTrace();
return null;
}
catch (SQLException e)
{ e.printStackTrace();
return null;
} } public void closeConnection(Connection conn)
{
if(conn!=null)try
{
conn.close();
conn=null;
}
catch (SQLException e)
{
e.printStackTrace();
}
}2.4 weblogic連接池public Connection createConnection()
{
Context ctx = null;
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY);
ht.put(Context.PROVIDER_URL, URL);
// ht.put(Context.SECURITY_PRINCIPAL, "admin");
// ht.put(Context.SECURITY_CREDENTIALS, "11111111"); Connection conn = null; try
{
ctx = new InitialContext(ht);
DataSource ds = (DataSource) ctx.lookup(POOL_NAME);
return ds.getConnection();
}
catch (NamingException e)
{ e.printStackTrace();
}
catch (SQLException e)
{ e.printStackTrace();
}
return null; } public void closeConnection(Connection conn)
{
if (conn != null)
try
{
conn.close();
conn = null;
}
catch (SQLException e)
{ e.printStackTrace();
} }3,4的方法比較好
2. jsp連接池連接資料庫,我有兩句代碼看不懂,求高手解釋
你看下這個jsp引入了哪些jsp或者java包,順著往上查。這個是封好的方法。
3. 面試時面試管要你寫一個資料庫連接池 怎麼寫(代碼)
ASP+access資料庫連接
<%
set conn= Server.CreateObject("adodb.connection")
conn.open "provider=microsoft.jet.oledb.4.0;data source="&server.MapPath("data/db.mdb")
%>
你應該反問他,你需要我寫那一種資料庫連接的代碼呢??因為不同的資料庫有不同的用法和安全性~~~
MSSQl和mysql都算是比較安全的!但是就需要伺服器的支持,而access一般來說,只要伺服器支持ASP的就可以了!~~
還有其他特別的資料庫,例如:Oracle等等。都有不同的連接方法和代碼。如果不是很具體的說明使用那種資料庫,很難做出正確答案!
用我的和1樓的都可以的!只是資料庫不同~~~
還有你要問你是想我用什麼的語言實現。網頁類語言很多的!
常用的有:ASP,ASP.net,PHP,CGI,JSP。
各種的資料庫連接方式都不同,而代碼就更為不同了!
但是基本原理都和二樓的大為相似~~~
所以要看你的要求達到那個水平才行~~~
4. java 多次執行一個sql後 釋放不了資料庫連接池 怎麼辦 代碼如下!求解決
貌似你的if段裡面有個break吧!不知道你這段語句是否是在某循環中吧
如果碰到break就會退出循環,就別說後面的s.close()了
也就是說數據連接無法合理關閉,可能會出現各種溢出,連接不夠用等
5. 如何在NetBeans中設置資料庫連接池
以往要設置資料庫連接池,需要藉助於第三方軟體。但現在NetBeans所帶的Tomcat 5.5.7及Sun Application Server 8均可以直接設置。下面談談如何在Tomcat 5.5.7下設置。
1. 下載資料庫的專用連接驅動,並將其復制到C:Program Filesetbeans-4.1entERPrise1jakarta-tomcat-5.5.7commonlib文件夾下面。
假設所用資料庫是Sybase的Adaptive Server Anywhere,從Sybase官方站點下載JConnect-6_0,從中抽取出jconn3這個驅動,復制到上述文件夾下。
2. 啟動Tomcat,在IE輸入http://localhost:8084/admin/,以管理員身份登錄管理。用戶登錄的方法可參考第5樓。點擊Resources下的Data Sources,在右邊Data Source Actions的下拉框中選Create New Data Source,按下表示範填寫:
JNDI Name: sybase/poolDB /* 根據喜好填 */
Data Source URL: JDBC:sybase:Tds:<localhost>:<埠號>
/* 資料庫的地址,此為jconn3的形式,埠號需查詢確認,但一般都是固定的,除非自己更改 */
JDBC Driver Class: com.sybase.jdbc3.jdbc.SybDriver /* jconn3的驅動 */
User Name: dba/* 用戶名,默認為dba */
Password: *** /* 密碼,默認為sql */
Max. Active Connections: 4/* 最大活動連接數 */
Max. Ide Connections: 2 /* 最大空閑連接數 */
Max. Wait for Connecton: 5000 /* 等待連接的最大秒數 */
Validation Query: /* 驗證字元串,可不填 */
按"Save",再按"Commit Changes",Tomcat在後台將此變化保存到server.XML文件中。"Commit Changes"是最容易忘記的,小心。
3. 以下均轉入NetBeans環境中設置。在context.xml修改的內容:
<Context path="/Matrix">
<ResourceLink global="sybase/poolDB" name="sybase/poolDB" type="Javax.sql.DataSource"/>
</Context>
"/Matrix"為此Web應用的根地址,表現為http://localhost:8084/Matrix。
4. 在web.xml中加入:
<resource-ref>
<description>Sybase Database Connection Pool</description>
<res-ref-name>sybase/poolDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
5. 好了,可以使用連接池了。以下代碼為在JSP文件中使用JSTL標簽庫的範例。
<sql:query var="queryresults" dataSource="sybase/poolDB">
SELECT * FROM customer
</sql:query>
6. mysql 資料庫連接池
把url改成url="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=GB2312"
7. 使用C#訪問Oracle,使用連接池,代碼如何寫,資料庫端要不要做配置
string my="data source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) (HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=cjsorcl)));User ID=cjsdog;Password=cjsmap;Pooling = True;Max Pool Size = 10;Min Pool Size = 1;"
OracleConnection conn = new OracleConnection(my);
conn.Open();
... ...
... ...
conn.Close();
連接字元串後加「Pooling = True;Max Pool Size = 10;Min Pool Size = 1;」這三個參數即可實現應用連接池。
Pooling:是否啟用連接池,True為啟用
Max Pool Size:連接池最大連接數
Min Pool Size:連接池最小連接數
8. 以下是C3P0資料庫連接池使用代碼,說明各語句含義 Class.forName("com.mysq
Class.forName("com.mysql.jdbc.Driver");//載入驅動類datasource=new combopooledDataSource();datasource.setDriverClass("com.mysql.jdbc.Driver");//設置驅動datasource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/reg")datasource.setUser("root");//設置用戶名datasource.setPassword("037500");//設置密碼conn=C3P0DAO.getConnection();//獲取連接pt=conn.prepareStatement("insert into fckeditor (content) value(?)");//預編譯sql語句pt=setString(1,content);//設置參數pt.excute();//執行sql語句pt.close();//關閉prepareStatement
conn.close();//釋放鏈接
9. java中建立資料庫連接池,有哪幾個步驟
Context context=new InitialContext();
DataSource ds=(DataSource)context.lookup("java:comp/env/jdbc/"+projectName);這里的projectName指的是你的項目名稱然後在tomcatde 的\conf\Catalina\localhost目錄下配置一個和你項目名稱相同的xml文件文件的配置方法可以去網路下很多的,這樣就可以使用連接池了。
10. 請問那位可以給個用純java實現資料庫連接池的代碼
DataSource ds=null;
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
String username=null;
try{
//實現數據連接池
Context ctx=new InitialContext();
ds=(DataSource)ctx.lookup("java:comp/env/jdbc/userInfo");
}catch(NamingException ne){ne.printStackTrace();}
try{
con=ds.getConnection();
String sql="select * from guestbook order by gst_time desc";
st=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
rs=st.executeQuery(sql);
。。。。。。
。。。
}
在這段代碼中
Context ctx=new InitialContext();
ds=(DataSource)ctx.lookup("java:comp/env/jdbc/userInfo");就是連接池代碼。
它是讀取配置文件(Context.xml)中數據的。
以下是配置文件:
<Context path="/WebMole1" docBase="E:\Home\WebMole1" reloadable="true">
<Resource name="jdbc/userInfo" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000" username="sa" password="bye0406"
driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"
url="jdbc:microsoft:sqlserver://localhost:1433;databasename=userInfo" />
</Context>
path和docBase中的路徑根據自己需要配置路徑。該路徑是WEB應用程序的路徑。driverClassName和url是連接資料庫的驅動類和連接的URL,是根據你使用的哪種資料庫而定。
以下是四種資料庫的配製驅動:
驅動
SQL Server 2000
類名:com.microsoft.jdbc.sqlserver.SQLServerDriver
URL:jdbc:microsoft:sqlserver://localhost:1433;databasename=pubs
Oracle
類名:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@localhost:152:ORCL
Mysql
類名:com.mysql.jdbc.Driver
URL:jdbc:mysql://localhost:3306/databasename
JDBC-ODBC
類名:sun.jdbc.odbc.JdbcOdbcDriver
URL:jdbc:odbc:datasource_name;