读书人

兑现jdbcOpenConnectionInView

发布时间: 2012-10-26 10:30:59 作者: rapoo

实现jdbcOpenConnectionInView
嘿嘿!看了看spring代码。自己写了个jdbc的连接
贴出来代码。

package com.jy.jdbc;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import javax.sql.DataSource;import net.sourceforge.jtds.jdbcx.JtdsDataSource;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class ConnectionFactory {private final static String USER = "";private final static String PWD = "";private final static String IP = "";private final static String DATABASE="";private final static Log logger = LogFactory.getLog(ConnectionFactory.class);private final static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();private  static DataSource dst=null;// jtds数据源 static   {JtdsDataSource ds = new JtdsDataSource();ds.setServerType(1);// SQL SERVERds.setServerName(IP);ds.setDatabaseName(DATABASE);ds.setPortNumber(1433);ds.setXaEmulation(true);try {ds.setSocketTimeout(3000);} catch (SQLException e1) {logger.error(e1);}ds.setMaxStatements(500);ds.setUser(USER);ds.setBatchSize(50);ds.setCacheMetaData(true);ds.setPassword(PWD);dst=ds;} public static Connection getConnection() {Connection conn = threadLocal.get();if (conn == null) {try {conn = dst.getConnection();threadLocal.set(conn);} catch (SQLException e) {logger.error("从连接池获取连接失败!:" + e.getMessage());}}return conn;}//dbcp连接池//public static DataSource getDataSource() {//BasicDataSource ds = new BasicDataSource();//ds.setDriverClassName(CLASSNAME);//ds.setUsername(USER);//ds.setPassword(PWD);//ds.setUrl(URL);//ds.setMaxActive(50);//ds.setMaxIdle(50);//ds.setMaxWait(3000); // 10 seconds//ds.setMaxOpenPreparedStatements(500);//System.out.println("NumActive: " + ds.getNumActive() + ","//+ "NumIdle: " + ds.getNumIdle());////return ds;//}// 关闭连接public static void closeConnection() {Connection conn = threadLocal.get();threadLocal.set(null);try {if (conn != null && !conn.isClosed()) {conn.close();}} catch (SQLException e) {logger.error("关闭连接失败!" + e.getMessage());}}public static void main(String[] args) {for (int i = 0; i < 2; i++) {Connection conn = getConnection();try {Statement st=conn.createStatement();ResultSet rs=st.executeQuery("select * from test");while(rs.next()){System.out.println(rs.getInt("id"));}closeConnection();} catch (SQLException e) {e.printStackTrace();}}}}

写个request监听器
package com.tool;
import javax.servlet.ServletRequestEvent;import javax.servlet.ServletRequestListener;import com.jinyu.jdbc.ConnectionFactory;public class ListenterCloseConnection implements ServletRequestListener{public void requestDestroyed(ServletRequestEvent arg0) {ConnectionFactory.closeConnection();}public void requestInitialized(ServletRequestEvent arg0) {}}


在web.xml
配置如下
<!-- 监听器,关闭Connection --><listener>  <listener-class>    com.tool.ListenterCloseConnection  </listenerclass></listener>

那么同一次request请求,只打开一次连接!所以不论采用Struts还是Servlet还是直接用jsp。只打开连接。不需关闭连接。

读书人网 >其他数据库

热点推荐