原文链接:http://club.topsage.com/forum.php?mod=viewthread&tid=2549653
一、数据源简介:
在java语言中,datasource对象就是一个代表数据源实体的对象。一个数据源就是一个用来存储数据的工具,它可以是复杂的大型企业级数据库,也可以是简单得只有行和列的文件。数据源可以位于在服务器端,也可以位于客服端。
应用程序通过一个连接来访问数据源,那么一个datasource对象就是用于提供连接数据源的工具。datasource接口提供了两个方法用于建立和数据源的连接
使用datasource对象建立和数据库的连接比起使用drivermanager接口更加高效,虽然两者的使用范围都很相似,并且都提供了方法用于建立和数据库的连接,设置连接的最大超时时间,获取流、登录。
但两者之间的区别更加明显。和drivermanager不同,一个datasource对象能够识别和描述它所代表的数据源的属性,而且datasource对象的工作和jndi(javatm naming and directory interfaceti)具有密切的关系,datasource的建立、发布、独立于应用程序的管理都依靠jndi技术。
在jdbc2.0或jdbc3.0中,所有的数据库驱动程序提供商必须提供一个实现了datasource接口的类,要使用数据源必须首先在jndi中注册该数据源对象。
如果在jndi中注册了数据源对象,将会比起使用drivermanager来具有两个方面的优势:
首先程序不需要像使用drivermanager一样对加载的数据库驱动程序信息进行硬编码,程序员可以选择先在jndi中注册这个数据源对象,然后在程序中使用一个逻辑名称来引用它,jndi会自动根据你给出的名称找到与这个名称绑定的datasource对象。然后就可以使用这个datasource对象来建立和具体数据库的连接了。
其次,使用实现了datasource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。
二、jndi简介:
jndi是用于向java程序提供目录和命名功能的api。它被设计成独立于特定的目录服务,所以各种各样的目录都可以通过相同的方式进行访问。
可以简单地把jndi理解为一种将对象和名字绑定的技术,对象工厂负责生产出对象,这些对象都和惟一的名字绑定。外部程序可以通过名字来获取对某个对象的引用。
在intranets(企业内部网)和internates(互联网)中目录服务(directory service)扮演了一个非常重要的角色,它能够在众多的用户、机器、网络、服务、应用程序中访问各种各样的信息。目录服务提供了一系列的命名措施,用人类可以理解的命名方式来刻画各种各样的实体之间的关系
一个企业式计算环境(computing environment)通常是由若干代表不同部分的命名复合而成。比如在一个企业级环境中dns(domain name system)通常被当成顶层的命名方案(top-level namein facility)区分不同的部门或组织。而这些部门或组织自己又可以使用诸如ladp或nds的目录服务
从用户的角度来看,这些都是由不同的命名方案构成的复合名称。url就是一个很典型的例子,它由多个命名方案构成。使用目录服务的应用程序必须支持这种复合构成方式
使用目录服务api的java开发人员获得的好处不仅在于api独立于特定的目录或命名服务,而且可以通过多层的命名方案无缝访问(seamless acess)目录对象。实际上,任何的应用程序都可以将自身的对象和特定的命名绑定起来,这种功能可以使到任何的java程序查找和获取任何类型的对象
终端用户可以方便地使用逻辑名称从而轻易地在网络上查找和识别各种不同的对象,目录服务的开发人员可以使用api方便地在不同的客服端之间切换而不需要作任何更改
三、数据源和连接池的关系:
jdbc2.0提供了javax.sql.datasource接口,它负责建立与数据库的连接,在应用程序访问数据库时不需要编写连接数据库的代码,可以直接从数据源获得数据库连接。
在datasource中事先建立了多个数据库连接,这些数据库连接保存在连接池(connect pool)中。java程序访问数据库时,只需要从连接池中取出空闲状态的数据库连接;当程序访问数据库结束,再将数据库连接放回连接池。
四、数据源和jndi的关系:
datasource对象是由tomcat提供的,因此不能在程序中采用创建一个实例的方式来生产datasource对象,而需要采用java的另一个技术jndi,来获得datasource对象的引用。
tomcat把datasource作为一种可以配置的jndi资源来处理。生成datasource对象的工厂为org.apache.commons.dbcp.basicdatasourcefactory。
在javax.naming包中提供了context接口,该接口提供了将对象和名字绑定,以及通过名字检索对象的方法。context中的主要方法有:
bind(string name,object object):将对象与一个名字绑定
lookup(string name):返回与指定的名字绑定的对象
五、tomcat中数据源的配置:
数据源的配置涉及修改server.xml和web.xml,在server.xml中加入定义数据源的元素<resource>,在web.xml加入<resource-ref>元素,声明该web应用所引用的数据
a.在server.xml中加入<resource>元素:<resource>元素用来定义jndi resource。
属性 描述
name 指定resource的jndi名字
auth 指定管理resource的manager,它有两个可选值:container、application
type 指定resource所属的java类名
<resource name = "jdbc/bookdb"
auth = "container"
type = "javax.sql.datasource" />
b.在<resource>元素中加入<resourceparams>元素:<resourceparams>元素用来指定各种参数值
属性 描述
factory 指定生成的dataresource的factory类名
maxactive 指定数据库连接池中处于活动状态的最大连接数目,0表示不受限制
maxidle 指定数据库连接池中处于空闲状态的最大连接数目,0表示不受限制
maxwait 指定连接池中连接处于空闲状态的最长时间,超过会抛出异常,-1表示无限
username 指定连接数据库的用户名
password 指定连接数据库的口令
driverclassname 指定连接数据库的jdbc驱动程序
url 指定连接数据库的url
<resourceparams name = "jdbc/bookdb"> <parameter> <name>factory</name> <value>org.apache.commons.dbcp.basicdatasourcefactory</value> </parameter> <parameter> <name>maxactive</name> <value>100</value> </parameter> <parameter> <name>maxidle</name> <value>30</value> </parameter> <parameter> <name>maxwait</name> <value>10000</value> </parameter> <parameter> <name>username</name> <value>user</value> </parameter> <parameter> <name>password</name> <value>1234</value> </parameter> <parameter> <name>driverclassname</name> <value>com.mysql.jdbc.driver</value> </parameter> <parameter> <name>url</name> <value>jdbc:mysql//localhost:3306/bookdb?autoreconnect=true</value> </parameter> </resourceparams>
c.在web.xml中加入<resource-ref>元素:<resource-ref>元素表示在web应用中引用jndi资源
属性 描述
description 对所引用的资源的说明
res-ref-name 指定所引用资源的jndi名字,与<resource>元素中的name属性对应
res-type 指定所引用资源的类名字,与<resource>元素中的type属性对应
res-auth 指定所引用资源的manager,与<resource>元素中的auth属性对应
六、在web应用中使用数据源:
javax.naming.context提供了查找jndi resource的接口,可以通过三个步骤来使用数据源对象:
a.获得对数据源的引用:
context ctx = new initalcontext();
datasource ds = (datasource)ctx.lookup("java:comp/env/jdbc/bookdb");
b.获得数据库连接对象:
connection con = ds.getconnection();
c.返回数据库连接到连接池:
con.close();
在连接池中使用close()方法和在非连接池中使用close()方法的区别是:前者仅仅是把数据库连接对象返回到数据库连接池中,是连接对象又恢复到空闲状态,而非关闭数据库连接,而后者将直接关闭和数据库的连接
七、发布使用数据源的web应用:
如果直接同jdbc访问数据库,可以把jdbc驱动程序拷贝到web应用的web-inf/lib目录或者tomcat安装目录下的common/lib目录下。
如果通过数据源访问数据库,由于数据源由servlet容器创建并维护,所以必须把jdbc驱动程序拷贝到tomcat安装目录下的common/lib目录下,确保servlet容器能够访问驱动程序。
特别说明:本人转载文章纯为技术学习,总结经验,并无其他目的,若有他人继续转载,请链接原作者的地址,而不是本文的地址,以示对作者的尊重。最后对原作者的辛勤劳动表示感谢!
分享到:
相关推荐
在这里,用户需要定义模板,并将其与数据源进行对应。模板定义又可以分为三个小部分:屏幕录像、源表定义和转换字段对应。 预转换 预转换是 LSMW 操作的第四步。在这里,用户需要将准备好的数据传入到 SAP 系统...
通过LINQ,我们可以对各种数据源进行查询,如数组、集合、数据库等。 3. **匿名类型**:C# 3.0开始支持匿名类型,允许开发者在不需要为对象定义正式类的情况下创建实例。这对于临时数据存储和处理非常有用。 4. **...
LwIP协议栈源码详解是一项对LwIP协议栈源代码进行深度解析和评解的工作,旨在帮助开发者更好地理解和使用LwIP协议栈。LwIP(Light-Weight IP)是一个开源的TCP/IP协议栈实现,专门针对嵌入式系统进行优化,以减少...
标题中的"MANIFEST.MF 文件内容详解(转)"是指一篇关于理解Java应用程序的MANIFEST.MF文件的文章。MANIFEST.MF文件是Java档案(JAR)文件格式的一部分,它包含了有关JAR文件元数据的重要信息。这篇博文可能是从其他...
《Linux select系统调用详解》 在Linux操作系统中,`select`系统调用是一个非常重要的I/O多路复用机制,它允许程序同时监控多个文件描述符(file descriptor,简称句柄)的状态变化,以便在任何句柄准备好进行读写...
这篇详解将深入探讨字节码的结构和组成,帮助理解Java程序在JVM中的执行过程。 首先,`.class`文件是Java编译器将源代码(`.java`文件)编译后的结果。每个`.class`文件对应于一个类或接口,包含了类的定义、方法、...
**JSTL(JavaServer Pages Standard Tag Library)详解** JSTL是JavaServer Pages标准标签库,它提供了一组预定义的标签,用于简化JSP页面的开发,使其更加结构化,可读性更强,同时也降低了Java代码在页面中的使用...
在数据库领域,Oracle通用连接(Generic Connectivity)提供了一种强大的机制,允许Oracle数据库通过标准的ODBC或OLE DB接口来访问非Oracle数据源。本文将详细介绍如何配置Oracle通用连接以实现与PostgreSQL数据库的...
8.4 jdbc数据源和连接池 299 8.5 mysql对中文的处理 302 8.6 小结 302 第9章 会话跟踪 303 9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话...
8.4 jdbc数据源和连接池 299 8.5 mysql对中文的处理 302 8.6 小结 302 第9章 会话跟踪 303 9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话...
bootStrap table获取数据有两种方式,一是通过table 的data-url属性指定数据源,二是通过JavaScript初始化表格时指定url来获取数据 [xhtml] view plain copy <table data-toggle="table"> <thead> ... ...
8.4 jdbc数据源和连接池 299 8.5 mysql对中文的处理 302 8.6 小结 302 第9章 会话跟踪 303 9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话...
1. **创建数据源:** - 在Sheet2中,按照类别(如“工业企业”、“商业企业”、“个体企业”等)输入企业名称。 - 使用“名称管理器”为每一列指定名称,如A列为“工业企业”。 2. **设置数据有效性:** - 在...
8.4 jdbc数据源和连接池 299 8.5 mysql对中文的处理 302 8.6 小结 302 第9章 会话跟踪 303 9.1 用于会话跟踪的技术 303 9.1.1 ssl会话 304 9.1.2 cookies 304 9.1.3 url重写 305 9.2 java servlet api的会话...
- `System.Data.OleDb`:用于处理OLE DB数据源,如Excel文件。 - `System.Data.SqlClient`:用于与SQL Server进行交互。 #### 三、核心代码解析 ##### 3.1 数据连接配置 ```csharp string connString = @...
**分布式开发中的WCF技术详解** Windows Communication Foundation (WCF) 是微软.NET Framework的一部分,它为构建可伸缩、安全和可靠的分布式应用程序提供了一个统一的编程模型。在本篇文章中,我们将深入探讨WCF...
- **配置MyBatis**:创建MyBatis的配置文件,包括数据源、事务管理器、Mapper扫描器等,并编写Mapper接口和对应的XML配置文件。 - **编写业务逻辑**:在Service层定义业务逻辑,通过@Autowired注解注入DAO接口,实现...
《使用Flask构建个人博客系统详解》 在IT行业中,个人博客系统是许多开发者学习新技术、分享知识的重要平台。本文将深入探讨如何使用Python的Web框架Flask来开发一个功能完善的个人博客系统,以"flaskTs-20180309...