欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实现jdbcOpenConnectionInView 博客分类: java SQLSQL ServerJavaJDBCServlet 

程序员文章站 2024-02-20 23:20:58
...
嘿嘿!看了看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 SERVER
		ds.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。只打开连接。不需关闭连接。