一、问题引入
在java程序中,需要访问数据库,做增删改查等相关操作。如何访问数据库,做数据库的相关操作呢?
二、Java连接数据库方法概述
java.sql提供了一些接口和类,用于支持数据库增删改查等相关的操作。该jar包定义了java访问各种不同数据库(mysql,oracle,sqlserver。。。。。)的统一接口和标准。同时,各个数据库厂商都提供了该jar包中定义的各个接口的实现类,用于具体实现本厂数据库的增删改查操作,即称之为“数据库驱动jdbc driver”。例如mysql的数据库驱动为:com.mysql.jdbc.driver;oracle的数据库驱动为:oracle.jdbc.driver.oracledriver。
在java程序中访问数据库,做数据库连接时,可以采用两种方式:
1、使用java.sql API
2、使用数据库连接池
目前存在多个开源的java数据库连接池,这些连接池都是在java.sql基础上编写而成。
? 该连接池的解决的问题是:
当使用java.sql中提供的api创 建数据库连接时候,需要耗费很大的资源,要进行用户名密码数据库连接验证等,即耗费资源也耗费时间。如果在程序中,每次需要访问数据库时候,都进行数据库 连接,那么势必会造成性能低下;同时,如果用户失误忘记释放数据库连接,会导致资源的浪费等。而数据库连接池就是解决该问题,通过管理连接池中的多个连接 对象(connection),实现connection重复利用。从而,大大提高了数据库连接方面的性能。
? 该连接池的功能是:
负责创建,管理,释放,分配数据库连接即(connection)。首先,负责创建相应数目的数据库连接对象(connection)对象,并存放到数据库连接池(connect pool)中。当用户请求数据库连接时,该连接池负责分配某个处于空闲状态的数据库连接对象;当用户发出释放该数据库连接时,该连接池负责将该连接对象重新设置为空闲状态,以便被别的请求重复利用。同时;数据库连接池负责检查(空闲时间>最大空闲时间)的数据库连接,并释放。
? 连接池主要参数介绍
最小连接数:初始化时,系统将负责创建该数目的connection放入连接池中。
最大连接数:系统允许创建connection的最大数值。当系统请求连接时候,且连接池中不存在空闲的连接:如果connection总数未超过最大连接数,那么连接池负责创建新的connection对象,并返回该对象;如果connection总数已经到达该最大连接数,那么连接池将用户请求转入等待队列。
三、常用的数据库连接池
1、 JNDI
2、 C3p0
3、 Apache 的Jakarta DBCP
4、 BoneCP
其中,sping框架依赖的第三方使用了c3p0和dbcp两种方式;而bonecp号称是速度最快的数据库连接池。JNDI方式创建实现的datasource是真正实现了javax.sql.datasource;其他的三种方式都不是。下面的列表,列出了几种方式的区别和不同:
序号
|
连接池名称
|
依赖的jar包
|
实现的datasource类
|
备注
|
1
|
JNDI
|
该数据源是由相应的web服务器(例如:tomcat,weblogic,websphere)负责初始化,创建,管理。程序中不需要引入特别的jar包。
|
Javax.sql.datasource
|
|
2
|
C3P0
|
c3p0-0.9.xxx.jar
|
com.mchange.v2.c3p0.ComboPooledDataSource
|
|
3
|
DBCP
|
commons-dbcp.jar,commons-pool.jar
|
org.apache.commons.dbcp.BasicDataSource
|
|
4
|
BoneCP
|
bonecp-0.6.5.jar
· google-collections-1.0.jar
· slf4j-api-1.5.11.jar
· slf4j-log4j12-1.5.11.jar
·log4j-1.2.15.jar
|
BoneCPDataSource
|
|
备注:以上几种方式的数据库连接池的配置参数大同小异,略有差别;其参数的配置,既可以通过配置文件的方式配置,也可以通过硬编码的方式配置。
四、分别列出几种连接池的编码例子
(所有的例子均可以参考D:\work\qsyworkspace2\jdbctest项目)
1、 使用java.sql API直接访问数据库
详细请参考javasql.java文件。
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/editortest";
String user="root";
String password="123456";
Connection cn=DriverManager.getConnection(url, user, password);
Statement st=cn.createStatement();
String sql="select * from artical where id=1";
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
System.out.println("1:"+rs.getString(1));
System.out.println("2:"+rs.getString(2));
System.out.println("3:"+rs.getString(3));
System.out.println("4:"+rs.getString(4));
}
2、 使用JNDI方式
这种方式,是由web服务器,实现了java.sql.datasource。由web服务器负责初始化数据源,创建connection,分配,管理connection。由于本身是由web服务器实现的功能,因此不需要在项目project中引入特别的jar包,但是需要在服务器的某些配置文件中增加相关的配置。下面,以tomcat服务器为例,讲述这种方式的使用。
(1)、修改tomcat的conf下的context.xml文件,增加Resource的配置的支持。
(2)、由于数据源是由tomcat负责创建,所以需要的jdbc驱动应该放到tomcat的lib路径下。
(3)、编写使用java代码,并放在tomcat环境下使用,如下:
public void jnditest(){
// TODO Auto-generated method stub
try {
Context initcontext=new InitialContext();
Context context=(Context) initcontext.lookup("java:comp/env");
DataSource datasource=(DataSource)context.lookup("jdbc/editortest");
Connection cn=datasource.getConnection();
Statement st=cn.createStatement();
String sql="select * from artical where id=1";
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
System.out.println("1:"+rs.getString(1));
System.out.println("2:"+rs.getString(2));
System.out.println("3:"+rs.getString(3));
System.out.println("4:"+rs.getString(4));
}
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
(4)、详情参考jndisql。Java文件,以及index.jsp。
注意:该测试不能在main方法中测试;可以写一个jsp在tomcat环境中测试。因为:java单元的环境是jdk;而jsp的环境却是tomcat;数据连接池是在tomcat中配置的,所以能正常运行的,但java测试的环境只有jdk,所以在引用数据连接池时就时出现找不到环境的错误。
使用环境:当使用weblogic或者websphere等高级的web服务器的时候,可以考虑使用这种方式提高性能。
3、 使用C3p0方式
C3P0是开源的数据库连接组件,支持创建数据库连接池,管理connection等功能。使用该种方式做数据库连接时候,需要导入c3p0-0.9.1.2.jar。
同时,关于数据库连接的具体参数,例如:url,username,password,最小连接数,最大连接数。。。。。等信息既可以在xml配置文件中配置,也可以通过程序编码方式创建。Spring支持c3p0的数据库连接池方式,因此在spring环境中使用时,支持在applicationcontext.xml文件中配置。另外,由于数据库连接池在整个project中针对某个数据库而言是单例的,所以,即使通过编码的方式创建,那么要保证其单实例特性。如果存在多个,那么必然会导致性能低下。
下面,列出通过程序编码方式使用c3p0数据库连接池的方式。
ComboPooledDataSource ds = new ComboPooledDataSource();
try {
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");
ds.setUser("root");
ds.setPassword("123456");
ds.setMaxPoolSize(20);
ds.setInitialPoolSize(10);
ds.setMaxIdleTime(2000);
Connection cn=ds.getConnection();
Statement st=cn.createStatement();
String sql="select * from artical where id=1";
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
System.out.println("1:"+rs.getString(1));
System.out.println("2:"+rs.getString(2));
System.out.println("3:"+rs.getString(3));
System.out.println("4:"+rs.getString(4));
}
} catch (PropertyVetoException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
备注:通常使用方式,都是通过配置文件配置,几乎不会用到这种硬编码方式。在此,只是简单介绍C3P0的使用方式。详情,可以参考c3p0test.java。
4、 使用dbcp方式
DBCP方式,是apache提供的数据源连接池方式,支持数据库连接池创建,管理connection等功能。使用环境,需要导入commons-dbcp.jar 和 commons-pool.jar两个jar包。上面提到的JNDI方式,其实质实用的就是dbcp数据源;只是他是通过在web服务器上做配置,由web服务器负责创建该数据源。
同样的,dbcp数据源也支持xml配置文件和硬编码两种方式。通常使用方式,都是通过配置文件配置,几乎不会使用硬编。下面简单介绍dbcp方式的编码:
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/editortest");
ds.setUsername("root");
ds.setPassword("123456");
ds.setMaxIdle(20);
ds.setInitialSize(10);
ds.setMaxActive(2000);
try {
Connection cn=ds.getConnection();
Statement st=cn.createStatement();
String sql="select * from artical where id=1";
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
System.out.println("1:"+rs.getString(1));
System.out.println("2:"+rs.getString(2));
System.out.println("3:"+rs.getString(3));
System.out.println("4:"+rs.getString(4));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
5、 使用BoneCP方式。
BoneCP 是快速高效的数据库连接池组件,据说性能上目前是最好得,比C3P0和DBCP快25倍。使用该组件,需要导入bonecp- 0.6.5.jar,google-collections-1.0.jar,slf4j-api-1.5.11.jar,slf4j- log4j12-1.5.11.jar,log4j-1.2.15.jar。
下面,简单列出编码方式的使用,做简单的了解。
BoneCPDataSource ds = new BoneCPDataSource();
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");
ds.setUsername("root");
ds.setPassword("123456");
try {
Connection cn = ds.getConnection();
Statement st = cn.createStatement();
String sql = "select * from artical where id=1";
ResultSet rs = st.executeQuery(sql);
while (rs.next()) {
System.out.println("1:" + rs.getString(1));
System.out.println("2:" + rs.getString(2));
System.out.println("3:" + rs.getString(3));
System.out.println("4:" + rs.getString(4));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
总 结:以上,介绍了几种常用的数据源连接池;这几种连接池在使用过程,即支持硬编码的方式,也支持配置文件的配置方式;在正式实用的时候,应该尽量使用配置 的方式,便于维护和管理。硬编码的方式,可以做为测试使用。同时,spring框架,通过他自己的方式集成上述几种数据源,理论上来说,都支持。各个数据 源连接池都有一些公有的属性,因为他们都是从javax.sql.datasource继承而来,而且都有最大连接数,初始化连接数等概念。同时,他们又 分别有各自不同的属性,做了扩展。这里只是简单的介绍,在实际使用中,想要实现高性能的数据库连接池管理,还需要深入研究每种方式的连接属性配置;例如: 根据实际需要,设置合适的最小连接数和最大连接数,等待时间等。
五、 Java(x).sql直接操作数据库与各个开源数据源(datasource)关系
当 使用JDK提供的java(x).sql包中的类访问数据库时候,基本上用到的就是 drivermanager,connection,statement,resultset。其中drivermanger是类,他调用相应的驱动(即 各个数据库厂商提供的驱动)中的方法生成connection对象。Connection是接口,在各个数据库厂商提供的数据库驱动中,都实现了该接口。 例如:当使用com.mysql.jdbc.driver时候,生成的connection即为com.mysql.jdbc.Connection对 象。
Javax.sql包中定义了接口datasource,统一规定了作为数据源连接池必须提供的方法和属性等。各个数据源组件中提供的 datasource都实现了该接口。当通过数据源连接池的方式获取connnection的时候,同样的,各个数据源组件也都提供(实现了 java.sql.connection)接口的类。
更为具体的细节,可以参考jdk文档中关于java(x).sql包中相关类和接口的描述;参考开源数据源连接池组件的相关源码(例如C3P0);参考相关的数据库驱动。
六、 附录:Java开源的数据库连接池
在Java中开源的数据库连接池有以下几种 :
1, C3P0 C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
2,Proxool 这是一个Java SQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。
3,Jakarta DBCP DBCP是一个依赖Jakarta commons-pool对象池机制的数据库连接池.DBCP可以直接的在应用程序用使用。
4,DDConnectionBroker DDConnectionBroker是一个简单,轻量级的数据库连接池。
5,DBPool DBPool是一个高效的易配置的数据库连接池。它除了支持连接池应有的功能之外,还包括了一个对象池使你能够开发一个满足自已需求的数据库连接池。
6,XAPool XAPool是一个XA数据库连接池。它实现了javax.sql.XADataSource并提供了连接池工具。
7,Primrose Primrose是一个Java开发的数据库连接池。当前支持的容器包括Tomcat4&5,Resin3与JBoss3.它同样也有一个独立的 版本可以在应用程序中使用而不必运行在容器中。Primrose通过一个web接口来控制SQL处理的追踪,配置,动态池管理。在重负荷的情况下可进行连 接请求队列处理。
8,SmartPool SmartPool是一个连接池组件,它模仿应用服务器对象池的特性。SmartPool能够解决一些临界问题如连接泄漏(connection leaks),连接阻塞,打开的JDBC对象如Statements,PreparedStatements等. SmartPool的特性包括支持多个pools,自动关闭相关联的JDBC对象, 在所设定time-outs之后察觉连接泄漏,追踪连接使用情况, 强制启用最近最少用到的连接,把SmartPool"包装"成现存的一个pool等。
9,MiniConnectionPoolManager MiniConnectionPoolManager是一个轻量级JDBC数据库连接池。它只需要Java1.5(或更高)并且没有依赖第三方包。
10,BoneCP BoneCP是一个快速,开源的数据库连接池。帮你管理数据连接让你的应用程序能更快速地访问数据库。比C3P0/DBCP连接池快25倍。
相关推荐
对于任何从事数据库操作的Java开发者而言,掌握正确的JDBC连接字符串构造方法至关重要,这不仅能够确保数据库连接的稳定性和安全性,还能够提高代码的可读性和可维护性。 ### JDBC连接字符串概述 JDBC连接字符串,...
本篇文章将详细阐述JDBC的核心概念、步骤以及使用方法,旨在帮助初学者理解并熟练掌握Java中的数据库连接。 1. JDBC概述: JDBC是Sun Microsystems公司开发的一套API,它为Java程序员提供了一种标准化的方法来访问...
在Java编程中,数据库访问是不可或缺的一部分,主要是...总的来说,Java数据库访问服务的核心在于理解`java.sql`包中的API和选择合适的数据库连接池,正确配置和使用它们,可以显著提升应用程序的性能和资源利用率。
在JAVA中,可以通过JDBC(Java Database Connectivity)驱动连接并操作ACCESS数据库,实现数据的读写。 系统的核心功能包括: 1. 学生信息管理:录入、修改、删除学生的个人信息,如姓名、学号、年级、班级等。 2....
### JAVA连接数据库JDBC驱动汇总 #### 一、概述 ...在实际应用中,还需要根据项目需求选择合适的驱动版本,同时注意数据库连接的安全性和性能优化。希望本篇文章能够帮助读者更好地理解和使用JDBC技术。
本资料“java数据库驱动大全”是一个汇总,包含了广泛应用于不同场景和项目的数据库驱动连接包。 1. **JDBC API**: JDBC是Java中用于访问数据库的标准API,它提供了统一的接口,使得开发者可以使用相同的代码与不同...
3.7 将查询结果进行汇总 3.7.1 集合函数 3.7.2 使用HAVING子句来筛选组 3.7.3 使用索引提高SQL查询效率 3.7.4 格式化SQL命令 3.7.5 使用SQL连接 3.7.6 编写SQL的JOIN命令 3.7.7 使用UNION运算符进行组合查询...
3.7 将查询结果进行汇总 3.7.1 集合函数 3.7.2 使用HAVING子句来筛选组 3.7.3 使用索引提高SQL查询效率 3.7.4 格式化SQL命令 3.7.5 使用SQL连接 3.7.6 编写SQL的JOIN命令 3.7.7 使用UNION运算符进行组合查询...
### MySQL入门总结与Java数据库应用 #### MySQL基本操作与命令详解 MySQL作为一款广泛使用的开源关系型数据库管理系统,其在数据存储、管理及查询方面提供了丰富的功能与命令。以下是对给定文件中提及的一些关键...
本文主要介绍了Java实现批量向mysql写入数据的方法,该方法涉及Java基于JDBC连接mysql数据库及写入数据的相关操作技巧。JDBC(Java Database Connectivity)是Java语言中用于连接数据库的API,提供了多种数据库的...
在Java开发中,通过JDBC (Java Database Connectivity) 进行数据库连接是常见的操作之一。本文档汇总了多种常见数据库(如Oracle、SQL Server、MySQL等)的JDBC连接模版,方便开发者查阅与使用。 #### 二、Oracle 8...
**JDBC 数据库连接总汇** Java Database Connectivity (JDBC) 是 Java 平台中用于与各种数据库交互的标准API。它允许Java程序通过编写Java代码来执行SQL语句,实现对数据库的操作,如查询、插入、更新和删除数据。...
Java实现连接数据库及模糊查询...更多关于Java相关内容感兴趣的读者可查看本站专题:《Java+MySQL数据库程序设计总结》、《Java数据结构与算法教程》、《Java文件与目录操作技巧汇总》、《Java网络编程技巧大全》等。
- 创建数据库连接,通过`DriverManager.getConnection()`方法,如`Connection conn = DriverManager.getConnection(url, username, password)`,其中`url`、`username`和`password`分别是数据库的连接地址、用户名...
在实际开发过程中,开发者还需要考虑系统的安全性,如防止SQL注入、XSS攻击等,以及性能优化,如缓存策略、数据库连接池的使用等。此外,良好的文档记录也是项目成功的关键,包括设计文档、接口文档、用户手册等,...
在实现这些功能时,开发者需要编写Java代码来连接Access数据库,使用JDBC(Java Database Connectivity)驱动程序进行数据操作。通过PreparedStatement和ResultSet接口,可以高效、安全地执行SQL命令,获取和更新...
#### 二、Oracle数据库连接方式 在实际应用中,通常会遇到需要通过不同方式连接到Oracle数据库的需求,这里介绍几种常用的连接方法: 1. **通过JDBC驱动连接:** - 使用JDBC(Java Database Connectivity)连接...
主要是酒店管理系统的需求包括开台点菜功能、智能化获取菜品功能、自动结账功能、营业额报表功能等。...按日消费额汇总统计实现的月结账功能。 按日营业额实现的年结账功能。 系统运行稳定、安全可靠。
- **数据库连接管理**:由于数据库连接是有限的资源,应使用连接池(如C3P0、HikariCP等)来管理,防止过多的连接导致资源耗尽。 - **锁与同步**:在多线程环境中,对共享资源(如数据库连接)的访问需要同步控制,...
综上所述,本资料汇总包含的内容广泛且深入,从JDBC的基本使用到高级特性,再到数据库连接池的实现和优化,对于理解和掌握Java数据库编程具有很高的价值。通过学习这些内容,开发者可以有效地在Java应用中实现与...