Home JDBC、数据源、JNDI、数据库连接池
Post
Cancel

JDBC、数据源、JNDI、数据库连接池

JDBC

java database connectivity standard 是一套规范的面向应用程序的接口,通过它可以访问各类关系数据库。各个数据库会实现该接口作为驱动如jtds.jar,当然可以自己写实现。JDBC是低级API,提供访问数据库的接口,是构建高级API的基础,利用纯Java编写可以在任何操作系统任何Java环境下工作。JDBC API中定义了一些Java类分别用来表示与数据库的连接(connections),SQL语句(SQL statements),结果集(result sets)以及其它的数据库对象,使得Java程序能方便地与数据库交互并处理所得的结果。使用JDBC,所有Java程序(包括Java applications ,applets和servlet)都能通过SQL语句或存储在数据库中的过程(stored procedures)来存取数据库。要通过JDBC来存取某一特定的数据库,必须有相应的JDBC Driver,它往往是由生产数据库的厂家提供,是连接JDBC API与具体数据库之间的桥梁。JDBC Driver是用于特定数据库的一套实施了JDBC接口的类集。简单的说,JDBC可以做三件事:与数据库建立连接,发送SQL语句,处理结果。JDBC可以理解为ODBC的纯Java语言和面向对象的实现。

JDBC传统模式开发存在的主要问题

  • 时间和内存资源消耗巨大。

    普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再根据JDBC代码(或配置文件)中的用户名和密码进行验证其正确性。这一过程一般会花费0.05~1s,一旦需要数据库连接的时候就必须向数据库请求一个,执行完后再断开连接。显然,如果同一个数据库在同一时间有数十人甚至上百人请求连接势必会占用大量的系统资源,严重的会导致服务器崩溃。

  • 有内存泄漏的风险。

    因为每一次数据库连接使用完后都需要断开连接,但如果程序出现异常致使连接未能及时关闭,这样就可能导致内存泄漏,最终只能以重启数据库的方法来解决;另外使用传统JDBC模式开发不能控制需要创建的连接数,系统一般会将资源大量分出给连接以防止资源不够用,如果连接数超出一定数量也会有极大的可能导致内存泄漏。

数据源

数据源定义的是连接到实际数据库的一条路径而已,数据源中并无真正的数据,它仅仅记录的是你连接到哪个数据库,以及如何连接的,如ODBC数据源。也就是说数据源仅仅是数据库的连接名称,一个数据库可以有多个数据源连接。在Java语言中,DataSource对象就是一个代表数据源实体的对象。

JNDI

JNDI全称是java naming and directory interface(Java命名和目录接口)。简单点就是你按命名规则给一个东西命名然后你就可以通过该名字在特定环境下直接查找到该东西了。

JNDI中的命名(Naming),就是将Java对象以某个名称的形式绑定(binding)到一个容器环境(Context)中,以后调用容器环境到JNDI容器环境(Context)的查找(lookup)方法又可以查找出某个名称所绑定的Java对象。

这样做的好处在于在真实的项目应用中,通常是由系统程序或框架程序先将资源对象绑定到JNDI环境中,以后在该系统或框架中运行的模块程序就可以从JNDI环境中查找这些资源对象了。比如,Tomcat服务器在启动时可以创建一个连接到某种数据库系统的数据源(DataSource)对象,并将该数据源(DataSource)对象绑定到JNDI环境中,以后在这个Tomcat服务器中运行的Servlet和JSP程序就可以从JNDI环境中查询出这个数据源(DataSource)对象进行使用,而不用关心数据源(DataSource)对象是如何创建出来的,这种方式极大的增强了系统的可维护性,这样,当数据库系统的连接参数发生变更时,就只是Tomcat系统管理员一个人要关心的事情,而与所有的应用程序开发人员无关。

数据库连接池

为了解决由使用传统开发模式创建连接导致的一系列问题,我们可以采用数据库连接池技术。数据库连接池是负责分配、管理和释放数据库连接。使用数据库连接池是因为数据库连接是一种关键的有限的昂贵的资源。如Weblogic、Tomcat、WebSphere容器都实现了数据库连接池,但是数据库连接池是可以独立出来自己编码实现的。常见的数据库连接池有:c3p0、DBCP、BoneCP、Proxool等。

数据库连接池在系统启动时初始化了一定量maxIdle=idlenum的数据库连接,即没有使用中的连接被释放的情况下,连接池中保存的最大空闲连接数。数据库连接请求如果没有超过idle的值则直接去连接池中获取;如果超过了maxIdle的值则新建一个数据库连接;但如果数据库连接池中的连接总数超过了maxActive=activenum则做如下处理:

  • 直接抛错。
  • 让想要借出连接的线程等待一段时间,如果等不到,再抛错。
  • 每隔一段时间检查一次pool,直到有可用连接,否则一直等下去。
  • 永远可以拿到(视情况需要maxActive不设置或0或负)。

但当没有可以使用的数据库连接的时候,连接池将要等待一个连接被返回的最长时间(毫秒)maxWait=waitnum,超过这个时间就要抛出异常。

数据源与数据库连接池关系

  • 数据源是一种数据库对编程提供的一个接口,每个数据源对应一个数据库。
  • 连接池只是存放数据库连接对象的一个缓冲池,需要数据连接的时候从缓冲池中取就行了。
  • 连接池可以管理数据源。

数据源与JNDI关系

数据源是在JDBC 2.0中引入的一个概念。在JDBC 2.0扩展包中定义了javax.sql.DataSource接口来描述这个概念。如果用户希望建立一个数据库连接,通过查询在JNDI服务中的数据源,可以从数据源中获取相应的数据库连接。这样用户就只需要提供一个逻辑名称,而不是数据库登录的具体细节。即DataSource采用Java的JNDI技术,来获得DataSource对象的引用。

This post is licensed under CC BY 4.0 by the author.