一、环境
1、数据库驱动jar文件
2、DBCP方法
Commons-dbcp.jar:连接池的实现
Commons-pool.jar:连接池实现的依赖库
资源文件
3、c3p0方法:
c3p0-0.9.1.2.jar
配置文件:c3p0-config.xml
二、连接操作
1.DriverManager方法;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private static String driverClass = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/test";
private static String username = "root";
private static String password = "123456";
private static Connection conn = null;
static{
try {
//注册驱动
// 不要把conn = DriverManager.getConnection(url, username, password);
//放在这里。防止所有用户都用一个Connection
Class.forName(driverClass);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException{
conn = DriverManager.getConnection(url, username, password);
return conn;
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private static String driverClass = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/test";
private static String username = "root";
private static String password = "123456";
private static Connection conn = null;
static{
try {
//注册驱动
// 不要把conn = DriverManager.getConnection(url, username, password);
//放在这里。防止所有用户都用一个Connection
Class.forName(driverClass);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Connection getConnection() throws SQLException{
conn = DriverManager.getConnection(url, username, password);
return conn;
}
}
2.使用DataSource子类方法;
资源文件DBConnection.properties
driverClass = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
username = root
password = 123456
模拟数据连接池 DataSourcePool.java
package cn.langzi.jdbc.DataSource;
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;
import javax.sql.DataSource;
import javax.sql.DataSource;
public class DataSourcePool implements DataSource {
private static String url = null;
private static String username = null;
private static String password = null;
private static int size = 10;
private static LinkedList<Connection> list = new LinkedList<Connection>();
static{
try {
InputStream in = DataSourcePool.class.getClassLoader()
.getResourceAsStream(
"cn/langzi/jdbc/DataSource/DBConnection.properties");
Properties prop = new Properties();
prop.load(in);
Class.forName(prop.getProperty("driverClass"));
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
private static DataSourcePool pool = new DataSourcePool();
//创建对象就初始化size个数据库连接
private DataSourcePool(){
for(int i=0;i<size;i++){
try {
Connection conn = DriverManager.getConnection(url, username, password);
System.out.println(conn);
list.add(conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static DataSourcePool getInstance(){
return pool;
}
@Override
public Connection getConnection() throws SQLException {
if(list.size()>0){
//取到连接,即从list中弹出一个Connection 连接
final Connection conn = list.pop();
//动态代理,返回一个代理对象
return (Connection) Proxy.newProxyInstance(DataSourcePool.class.getClassLoade(), conn.getClass().getInterfaces(), new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//如果Connection调用的是close方法就将连接返回给数据连接池
if(method.getName().equals("close")){
list.push(conn);
return null;
}
return method.invoke(conn, args);
}
});
}
//连接用完
throw new RuntimeException("对不起,服务器繁忙!!!");
}
@Override
public Connection getConnection(String username, String password)
throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
package cn.langzi.jdbc.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DBConnection {
public static Connection getConnection() throws SQLException{
Connection conn = DataSourcePool.getInstance().getConnection();
return conn;
}
}
DBCP方法:
资源文件:dbcpconfig.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
连接数据库:
package cn.langzi.jdbc.DBCP;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
public class DBConnection {
private static DataSource dataSource = null;
static {
try {
//获取资源文件
InputStream in = DBConnection.class.getClassLoader().getResourceAsStream("cn/langzi/jdbc/DBCP/dbcpconfig.properties");
Properties properties = new Properties();
//加载资源文件
properties.load(in);
//建立数据工厂
BasicDataSourceFactory dataSourceFactory = new BasicDataSourceFactory();
dataSource = dataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
}
c3p0方法:
配置文件:c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="userApp">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<property name="minPoolSize">10</property>
<property name="maxPoolSize">20</property><!-- intergalactoApp adopts a different approach to configuring statement caching -->
<property name="maxStatements">0</property>
<property name="maxStatementsPerConnection">5</property>
<!-- he's important, but there's only one of him -->
<user-overrides user="master-of-the-universe">
<property name="acquireIncrement">1</property>
<property name="initialPoolSize">1</property>
<property name="minPoolSize">1</property>
<property name="maxPoolSize">5</property>
<property name="maxStatementsPerConnection">50</property>
</user-overrides>
</named-config>
</c3p0-config>
连接数据库:
package cn.langzi.jdbc.c3p0;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DbConnection {
private static DataSource dataSource;
static{
dataSource = new ComboPooledDataSource("userApp");
}
public static Connection getConnectioon() throws SQLException{
return dataSource.getConnection();
}
}
分享到:
相关推荐
常用的连接池工具有HikariCP、DBCP、C3P0等。 5. SQL语句执行:JDBC提供了Statement、PreparedStatement和CallableStatement三种方式执行SQL。Statement用于简单查询,PreparedStatement能防止SQL注入,...
为提高性能和资源利用率,开发中常使用连接池,如C3P0、HikariCP和Apache DBCP。它们预先创建一定数量的连接,程序需要时从池中获取,用完后归还。 6. **预编译的PreparedStatement** PreparedStatement具有预...
- 为了提高性能和资源利用率,使用连接池(如C3P0、HikariCP、Apache DBCP等)管理数据库连接。 - 通过DataSource的getConnection()方法获取连接,连接池会复用已存在的连接,减少创建和销毁连接的开销。 8. **...
- 使用连接池(如C3P0、Apache DBCP、HikariCP)提高性能和资源利用率。 - 事务级别调整、批处理和预编译SQL等优化策略。 9. **数据库元数据** - `DatabaseMetaData`接口:获取数据库的元信息,如表结构、列信息...
在实际应用中,我们通常会使用DataSource(数据源)来管理连接池,如Apache的Commons DBCP或C3P0,以及ORM框架如Hibernate和MyBatis,它们提供了更高级别的抽象和便利性,简化了JDBC的使用。 JDBC教程中还会涉及...
例如,使用Apache DBCP或C3P0等连接池库。 6. **处理异常** 在Java JDBC编程中,要妥善处理SQLException及其子类,确保在出现错误时能正确关闭资源并给出反馈。 7. **性能优化** - 使用PreparedStatement预编译...
7.连接池(Connection Pool):在实际应用中,使用连接池(如C3P0、HikariCP、Apache DBCP等)可以有效地管理数据库连接,提高系统性能。 在压缩包文件"8. 尚硅谷_佟刚_JDBC_JDBC元数据"中,我们可以期待找到有关...
- **连接池**:在生产环境中,通常使用连接池(如C3P0、HikariCP或Apache DBCP)来管理和复用数据库连接,提高性能和资源利用率。 - **事务管理**:JDBC提供了事务控制API,允许开发者管理数据库事务的提交、回滚和...
7. **连接池的使用**:在JSP应用中,通常会用到连接池(如C3P0、Apache DBCP或HikariCP),以提高性能和资源利用率。 8. **安全性最佳实践**:如何配置和使用JDBC驱动以增强安全性,如使用预编译的SQL语句防止SQL...
例如,使用Apache的Commons DBCP或C3P0库。 ### SQL操作 1. **查询**:通过`Statement.executeQuery()`执行SQL SELECT语句,返回ResultSet对象表示结果集。 2. **插入、更新、删除**:使用`Statement....
8. **性能优化**:JDBC驱动支持多种连接池实现,如C3P0、HikariCP、Apache DBCP等,以提高连接复用,降低系统开销。 9. **异常处理**:当发生错误时,JDBC驱动会抛出`SQLException`及其子类异常,开发者需捕获并...
- `Vendor`提供的`DataSource`实现,如C3P0、Proxool、DBCP等,具备数据库连接池功能,可以有效管理和复用数据库连接。 - `DataSourceUtils`工具类提供了获取和释放连接的方法,以及对事务的支持。Spring JDBC中的...
如C3P0、HikariCP、Apache DBCP等。 - **DataSource**:JNDI服务下的数据源对象,是连接池的Java接口,提供了更安全、更高效的连接管理。 ### 5. JDBC事务管理 JDBC支持四种事务隔离级别:读未提交(READ ...