现在的位置: 首页 > 综合 > 正文

Java程序数据库连接,数据源配置,数据库连接池

2013年08月24日 ⁄ 综合 ⁄ 共 4645字 ⁄ 字号 评论关闭

  

Java程序数据库连接,数据源配置,数据库连接池

Java程序,用到的数据库一定要配置数据源吗?

一般写小程序直接在程序里设置连接就可以了,而大的系统一般要配置数据源

数据源是要配置到中间件服务器中的(比如:Tomcat,JBoss,WebLogic一类的),配置后可以提高数据库查询性能,避免重复的打开和关闭数据库。因此开发java的B/S项目时(就是J2EE的项目,通过浏览器访问的项目),都会配置数据源连接。如果你写的管理软件是B/S结构,那么只需要在搭建环境的服务器上配置数据源就可以了,用户访问时是通过浏览器访问,不需要做其他设置。如果是C/S(就是用户需要单独安装客户端程序,比如QQ),也不需要在用户那里设置数据源,只需要在你的服务器端程序上手工配置好数据源即可。java实现数据库操作,现在多数流行的都是JDBC,采用配置数据源的方式多数是用了框架的原因,比如Hibernate、EJB、Struts、Spring。但是所有的数据源配置原理都是基于JDBC的操作。

1.直接编码连接数据库

JDBC (Java Database Connectivity)

JDBC以一种统一的方式来对各种各样的数据库进行存取,JDBC为开发人员隐藏了不同数据库的不同特性。程序员开发时,知道要开发访问数据库的应用,于是将一个对应数据库的JDBC驱动程序类的引用进行了编码,并通过使用适当的JDBC URL 连接到数据库。

代码示例: 

数据库连接代码1

 

 

或者通过配置属性文件的方式:

数据库连接代码2

 

以上都是传统的做法,这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和各种数据库,可以很快开发出相应的应用程序。

这种方式带来的问题:

1、数据库服务器名称、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改用DB2或者Oracle,引发JDBC驱动程序包和类名需要修改;
3、随着实际使用终端的增加,原配置的连接池参数可能需要调整;

解决办法:
程序员应该不需要关心“具体的数据库后台是什么?JDBC驱动程序是什么?JDBC URL格式是什么?访问数据库的用户名和口令是什么?”等等这些问题,程序员编写的程序应该没有对 JDBC 驱动程序的引用,没有服务器名称,没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。由此,就有了JNDI,配置数据源。

2.配置数据源

JNDI(Java Naming and Directory Interface)

JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP,本地文件系统,后者在应用服务器中的对象。在JNDI中,在目录结构中的每一个结点称为context。每一个JNDI名字都是相对于context的。应用可以通过这个初始化的context经由这个目录树来定位它所需要的资源或对象。

在Tomcat中配置数据源获得连接

 在tomcat中通过JNDI服务获得DataSource引用,通过DataSource获得数据库连接,步骤如下:
 1.配置数据源JNDI服务
 2.在应用中通过JNDI使用javax.naming.Context的lookup方法来检索DataSource引用
 3. DataSource的getConnection方法获得连接

 

配置JNDI服务的代码:

数据库连接代码3

 

配置文件内容:

数据库连接代码4

 

在应用中通过JNDI使用javax.naming.Context的lookup方法来检索DataSource引用,由DataSource获得数据库连接:

数据库连接代码5

 

直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几,但是现在的程序可以不用关心具体JDBC参数了。在系统部署后,如果数据库的相关参数变更,只需要修改配置文件中的JDBC参数,只要保证数据源的名称不变,那么程序源代码就无需修改。由此可见,JNDI避免了程序与数据库之间的紧耦合,使应用更加易于配置、易于部署。JNDI在满足了数据源配置的要求的基础上,还进一步扩充了作用:所有与系统外部的资源的引用,都可以通过JNDI定义和引用。所以,在J2EE规范中,J2EE
中的资源并不局限于 JDBC 数据源。引用的类型有很多,其中包括资源引用、环境实体和 EJB 引用。特别是 EJB 引用,它暴露了 JNDI 在 J2EE 中的另外一项关键角色:查找其他应用程序组件。EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中,这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理,从 EJB 组件到 JMS 队列和主题,再到简单配置字符串或其他对象,这可以降低随时间的推移服务变更所产生的维护成本,同时还可以简化部署,减少集成工作。

J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时,间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE
应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。在 J2EE 中,JNDI 是把 J2EE 应用程序合在一起的粘合剂,JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。

3.数据库连接池

连接池是创建和管理多个连接的一种技术,这些连接可被需要使用它们的任何线程使用。连接池技术基于下述事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC连接的1个线程。未处理事务时,连接处于闲置状态。使用连接池,允许其他线程使用闲置连接来执行有用的任务。事实上,当某一线程需要用JDBC在MySQL或其他数据库上执行操作时,需要用到由连接池提供的连接。使用连接完成线程后,线程会将连接返回给连接池,以便该连接能够被其他需要使用连接的线程使用。从连接池“借出”连接时,该连接仅供请求它的线程使用。从编程观点看,其效果等同于每次需要JDBC连接时调用DriverManager.getConnection(),但是,采用连接池技术,可通过使用新的或已有的连接结束线程。连接池技术能显著增加Java应用程序的性能,同时还能降低资源使用率。

连接池技术的主要优点包括:

(1) 缩短了连接创建时间

创建新的JDBC连接会导致联网操作和一定的JDBC驱动开销,如果这类连接是“循环”使用的,使用该方式,可避免这类不利因素。

(2)简化的编程模型

使用连接池技术时,每个单独线程能够像创建了自己的JDBC连接那样进行操作,从而允许使用直接的JDBC编程技术。

(3)受控的资源使用

如果不使用连接池技术,而是在每次需要时为线程创建新的连接,那么应用程序的资源使用将十分浪费,而且在负载较重的情况下会导致无法预期的结果。

注意,与数据库的每个连接均会在客户端和服务器端造成一定的开销(CPU、关联转换等)。每个连接均会对应用程序和数据库服务器的可用资源带来一定的限制。无论连接是否执行任何有用的任务,仍将使用这些资源中的相当一部分。

连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

幸运的是,Sun公司通过JDBC-2.0“可选”接口,完成了JDBC中连接池概念的标准化实施,所有主要应用服务器均实施了能够与MySQL Connector/J一起良好工作的这类API。

通常,你可以在应用服务器的配置文件中配置连接池,并通过Java命名和目录接口(JNDI)访问它。使用连接池时需要牢记的最重要事项是,无论在代码中出现了什么(异常、控制流等),连接以及由连接创建的任何部分(语句、结果集等)均应被关闭,以便能再次使用它们。如不然,它们将纠缠在一起,在最好的情况下,意味着它们所代表的数据库服务器资源(缓冲区、锁定、套接字等)可能会捆绑一段时间,在最坏的情况下,可能会导致永久捆绑。

连接池的最佳大小是什么?

取决于具体情况。尽管最佳大小取决与预期的负载和平均的数据库事务时间,最佳的连接池大小小于你的预期。例如,如果使用的是Sun公司的Java Petstore Blueprint应用程序,对于包含15~20个连接的连接池,使用MySQL和Tomcat,在可接受的相应时间下,可服务于中等程度的负载(600个并发用户)。要想确定用于应用程序的连接池大小,应使用诸如Apache Jmeter或The Grinder等工具创建负载测试脚本,并对应用程序进行负载测试。确定出发点的一种简单方法是,将连接池的最大连接数配置为“无限”,运行负载测试,并测量最大的并发连接数。随后,应进行反向操作,确定出使应用程序具有最佳性能的连接池的最小和最大值。

连接池与数据源区别?

数据库连接池是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应在请求队列中排队等待。并且应用程序可根据池中连接的使用率,动态增加或减少池中的连接数。当关闭连接操作时,连接并不真正的关闭,而是返回到连接池中作为空闲连接在后面继续使用,连接池技术解决了数据库连接频繁打开关闭所带来的性能问题。

有了连接池,我们没必要直接找数据源打交道了,连接池在你的程序所在的机器内存,数据源不一定,并且数据源和连接池会保持一定数量的连接,这样我们访问数据库的时候就不需要找数据源要连接,直接在本地内存中取得连接,可以提高程序的性能。连结池的存在是为了效率,因为实例化一个连接很耗费资源,而连接又有可重用的特征,所以可以把一定数量的连接放在连接池里面以提高效率。

 

Tomcat自带的数据库连接池管理

C3p0数据库连接池

数据库连接池配置代码:

数据库连接代码6

 

配置文件:

数据库连接代码7

 

 

 

【参考资料综合】

 

http://hi.baidu.com/sunkangle/blog/item/55a9db7cb076a3330dd7dadb.html  

JDBC与JNDI应用比较

 

http://13243356.javaeye.com/blog/402961   

数据库连接与数据源配置

 

http://hi.baidu.com/yaoming159/blog/item/5c4efe33e2122df31a4cfff5.html

JDBC与JNDI区别

 

http://wenwen.soso.com/z/q155303937.htm?pid=wenwen.autologin 

java数据库一定要配置数据源吗?

 

 

http://hi.baidu.com/begin_think/blog/item/b959f9f45b67092ebd310973.htmlJNDI

与JDBC比较以及连接池的技术

 

http://topic.csdn.net/u/20090311/10/f6ee00c1-34ed-42ef-b5aa-77d2c7a8e775.html 

连接池与数据源 分别起什么作用呢?

 

 

整理

By willowind

抱歉!评论已关闭.