博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(十) Web与企业应用中的连接管理
阅读量:4047 次
发布时间:2019-05-25

本文共 6230 字,大约阅读时间需要 20 分钟。

 

1.JNDI

在企业环境中部署JDBC应用时,数据库连接管理与JNDI(Java名字和目录接口)是集成在一起的。

e.g.  Context jndiContext = new InitialContext();

      DataSource source = (DataSource)jndiContext.lookup("java:comp/env/jdbc/corejava");

      Connection conn = source.getConnection();

注意:不再使用DriverManager,而是使用JNDI服务来定位数据源。一个数据源就是一个能够提供简单的JDBC连接和更高级服务的接口。javax.sql标准扩展包定义了DataSource接口。

 

在JavaEE 5的容器中,甚至可以不必编程进行JNDI查找,只需要在DataSource域上使用Resource注解,当加载应用时,这个数据源引用将被设置。

e.g.  @Resource("jdbc/corejava")

      private DataSource source;

 

2.连接池

因为数据库连接是有限的资源,如果用户在某个时刻离开应用,那么他占用的连接就不应该保持开发状态;另一方面每次查询都要获取连接并在随后关闭它的代价也是相当高的。

解决这个问题的办法是建立数据库连接池,这意味着数据库连接在物理上并未被关闭,而是保留在一个队列中并被反复重用。

连接池可以通过获取数据源并调用getConnection方法得到连接池中的连接。使用完连接后,调用close方法,使用该方法并不在物理上关闭连接,而只是告诉连接池已经使用完该连接。连接池通常还会将池机制用于预备语句上。

C3P0 DEMO

import java.io.FileInputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Statement;import java.util.Properties;import com.mchange.v2.c3p0.ComboPooledDataSource;public class DBUtil {		private static ComboPooledDataSource dataSource = null;	private static Properties param = null;	private static String prefix = null;	static{		FileInputStream fis = null;		try {			fis = new FileInputStream(System.getProperty("user.dir") + "/bin/database.properties");			param = new Properties();			param.load(fis);			fis.close();						if("MySQL".equalsIgnoreCase(param.getProperty("DatabaseType"))){				prefix = "mysql.";			}else if("Derby".equalsIgnoreCase(param.getProperty("DatabaseType"))){				prefix = "derby.";			}		}catch(Exception e){			e.printStackTrace();		}	}		public static Connection getConnection(){		try{			String drivers = param.getProperty(prefix + "jdbc.drivers");			if (drivers != null && !"".equals(drivers)) {				System.setProperty("jdbc.drivers", drivers);			}			String url = param.getProperty(prefix + "jdbc.url");			String username = param.getProperty(prefix + "jdbc.username");			String password = param.getProperty(prefix + "jdbc.password");			return DriverManager.getConnection(url,username,password);		}catch(Exception e){			e.printStackTrace();			return null;		}			}		public static Connection getConnectionByC3P0(){		try{			if(dataSource == null){				DBUtil.C3P0Init();			}			return dataSource.getConnection();		}catch(Exception e){			e.printStackTrace();			return null;		}			}	    public static void C3P0Init(){       	try{    		dataSource = new ComboPooledDataSource();    		String drivers = param.getProperty(prefix+"jdbc.drivers");    		if (drivers != null && !"".equals(drivers)) {    			dataSource.setDriverClass(drivers);    		}    		dataSource.setJdbcUrl(param.getProperty(prefix + "jdbc.url"));    		dataSource.setUser(param.getProperty(prefix + "jdbc.username"));    		dataSource.setPassword(param.getProperty(prefix + "jdbc.password"));    		//连接池中保留的最大连接数    		dataSource.setMaxPoolSize(20);    		//连接池中保留的最小连接数    		dataSource.setMinPoolSize(3);    		//初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3     		dataSource.setInitialPoolSize(3);    		//最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0    		dataSource.setMaxIdleTime(0);    		//当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3    		dataSource.setAcquireIncrement(3);    		//定义在从数据库获取新连接失败后重复尝试的次数。Default: 30     		dataSource.setAcquireRetryAttempts(30);    		//两次连接中间隔时间,单位毫秒。Default: 1000     		dataSource.setAcquireRetryDelay(1000);    		//如果设为true那么在取得连接的同时将校验连接的有效性。Default: false     		dataSource.setTestConnectionOnCheckin(false);    		//c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么    		//属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试    		//使用。Default: null    		dataSource.setAutomaticTestTable(null);    		//当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出    		//SQLException,如设为0则无限期等待。单位毫秒。Default: 0    		dataSource.setCheckoutTimeout(0);    		//JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。    		dataSource.setMaxStatements(0);    	}catch(Exception e){    		e.printStackTrace();    	}    } 		public static boolean createTable(Connection conn){		try{			Statement stmt = conn.createStatement();			String createTable = "CREATE TABLE test_table(" +								 " id INT," +								 " str VARCHAR(20)," +								 " ds TIMESTAMP," +								 " PRIMARY KEY (`id`))";			stmt.executeUpdate(createTable);			stmt.close();			return true;		}catch(Exception e){			e.printStackTrace();		}		return false;	}		public static boolean destroyTable(Connection conn){		try{			Statement stmt = conn.createStatement();			stmt.execute("DROP TABLE test_table");			stmt.close();			return true;		}catch(Exception e){			e.printStackTrace();		}		return false;	}} 
import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.sql.Timestamp;import java.util.Date;import com.shaogq.jdbc.util.DBUtil;public class TestC3P0 {	public static void main(String[] args) {		Connection conn = null;		try {			try{				//JDBC//				conn = DBUtil.getConnection();				//连接池				conn = DBUtil.getConnectionByC3P0();//				DBUtil.createTable(conn);				TestC3P0 t = new TestC3P0();//				t.init(conn);//				t.insertTimestamp(conn);//				t.moreResultSelect(conn);				t.insertGeneratedKeys(conn);			}finally{//				DBUtil.destroyTable(conn);				conn.close();			}		} catch (SQLException e) {			e.printStackTrace();		}	}			/**	 * 初始化数据库表中数据	 */	public void init(Connection conn){		try{			PreparedStatement prepStmt = null;			try{				String insertDate = "INSERT INTO test_table values(?,?,?)";				prepStmt = conn.prepareStatement(insertDate);				int[] ch = new int[]{1,2,3,4,5,6,7,8};				String[] str = new String[]{"a","b","c","d","e","f","g","h"};				for(int i=0;i
 

JNDI+C3P0

tomcat/conf/context.xml

 
project/WEB-INF/web.xml
DBConnection
TestJNDI
javax.sql.DataSource
Container
 
private static Connection conn = null;    static Context context = null;    static DataSource dataSource = null;        public static Connection getConnection() throws NamingException, SQLException{    	context = new InitialContext();    	dataSource = (DataSource) context.lookup("java:/comp/env/TestJNDI");    	if(dataSource!=null){    		conn = dataSource.getConnection();    	}         return conn;     }
 
注意:要通过TOMCAT DBCP来实现JNDI,连接数据库,需要将驱动JAR包拷贝到 apache-tomcat/lib/ 目录下

转载地址:http://qxyci.baihongyu.com/

你可能感兴趣的文章
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
关于进制转换的具体实现代码
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
mongdb在java中的应用
查看>>
区块链技术让Yotta企业云盘为行政事业服务助力
查看>>
Yotta企业云盘更好的为媒体广告业服务
查看>>
Yotta企业云盘助力旅游行业新发展
查看>>
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>