关键技术jsp与jdbc应用详解_第1页
关键技术jsp与jdbc应用详解_第2页
关键技术jsp与jdbc应用详解_第3页
关键技术jsp与jdbc应用详解_第4页
关键技术jsp与jdbc应用详解_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第 12 章连接池与事务本章属于的高级操作部分,学习了前面的基本理论后,这一章将一些基于高级应用的对象和接口。本章目标:掌握连接池的概念和使用理解分布式事务处理掌握例外处理了解高级数据类型配置并使用连接池yyyyyyy掌握的异常处理定制 SQL 类型12.1连接池在之前的数据库操作中,我们在调用数据库时,新建一个 Connection,物理的数据库连接和客户端的连接对象保持着一比一的对应关java.sqljavax.sql系,在单机开发测试中,非常方便,但是ConnectionPoolDataSource对于企业级的数据库系统调用带来一个问题,getConnection当大量用户时,每个客户的

2、会话都要花费getConnection资源去打开、初始化和关闭物理连接。我们可以用连接池(Connection Pool)来解决这个问题,连接池中可以保持一个数据库物理连接的高速缓存会话,也可以重复利用存这个缓存中的连接,极大地提高了性能和可测量性。连接池的原理如图 12-1 所示:ConnectionPooledConnectionor error event ConnectionEventConnectionEventListener图 12-1连接池的实现第三篇技术本章节将对连接池理论中的 ConnectionPoolDataSource 接口、PooledConnection 接口和C

3、onnectionEvent 类进行。通过实例子让读者学会连接池的配置和操作。12.1.1连接池数据源和 DataSource 实现类似,连接池(ConnectionPoolDataSource)只是一个接口,具体的实现由各个数据库的供应商提供。在统一的接口模式下,具体的实现细节对开发都是透明的。开发只需要关心如何配置连接池数据源和按照接口的方式获取连接。下面来看看连接池数据源有哪些可以调用。首先,该接口通过以下来获取连接池中的连接。返回的 PooledConnection 对象代表数据源的物理连接有实现细节。下面是 PooledConnection 接口的定义:封装了 PooledConne

4、ction 的所总体上,开发者可以使用 getConnection()获取 Connection。此时的 Connection 是逻辑上的连接,所以,要调用 Connection.()来关闭该连接。不过,这样只是关闭了逻辑上的连接,并没有关闭物理上的连接。物理的连接会被返回到连接池中以便可以重新利用。连接池有 以下重要属性:l maxStatements:整个连接池可以保持的语句数l initialPoolSize:连接池可以保持的物理连接数l minPoolSize:连接池应该时刻保持的可用的物理连接数l maxPoolSize:连接池可以保持的最大的物理连接数l maxIdleTime:多

5、少秒未用就会关闭连接l propertyCycle:连接池属性更新间隔遵循JavaBean 规范,对于 ConnectionPoolDataSource 的以上属性,都提供 getter 和setter 方法,这些属性在 ConnectionPoolDataSource 被配置的时候要进行初始化。通常实现连接池的服务,都提供对连接池的配置规范。在 ConnectionPoolDataSource 上设置,可以适用于这个数据源上的所有连接池的对象。管理池连接对象的应用服务器会用这些属性来管理连接池。12.1.2连接池处理由于连接池中的连接有服务器管理,服务器管理的就是每个连接的状态。所以需338

6、public interface PooledConnection Connection getConnection throws SQLException; voidthrows SQLException;void addConnectionEventListener ConnectionEventListener listener ; void removeConnectionEventListener ConnectionEventListener listener ;PooledConnection getPooledConnection() throws SQLException;

7、PooledConnection getPooledConnection (String user, String password) throwsSQLException;要配置相关的,通知服务器做出相应的动作。例如,当一个应用程序调用 Connection.()时,可能会激发以下:l connectiond:当与池连接对象相的逻辑连接对象被关闭时,会产生这个。这是在正常情况下 Connection.()触发的。l connectionErrorOccurred:当一个致命错误发生时会触发这个连接。,例如断开服务器中的连接池管理器池对象的做法是用 PooledConnection.addCo

8、nnection EventListener()把为池连接对象的者。通常,在接池管理器向应用程序返回接对象之前,就把自已为池连接对象的者。当相应的发生时,驱动程序就调用 ConnectionEventListener 的 connectiond 和connectionErrorOccurred。这两个都以接ConnectionEvent 对象作为参数。这个参数可以分出是哪个池连接对象被关闭或是发生了错误。连接池的其他的原理。都是遵循同样12.1.3三层环境下的连接池操作在三层环境下,应用程序调用连接池操作时,完整的过程如下:(1)客户端调用 DataSource.getConnection。(

9、2)应用程序服务器在它的连接池中寻找是否一个适当的池连接对象可以使用,通常每个服务器寻找合适的池连接对象的算法都是不同的。如果有合适的对象,就返回该连接给应用程序。如果连接池中没有合适的池连接对象,服务器将会自动调用以下物理连接。创建完新的池连接对象后,把这个对象返回给应用程序。来获得一个新的 ConnectionPoolDataSource.getPooledConnection(3)应用服务器调用 PooledConnection.getConnection()来获得逻辑的连接对象。(4)应用服务器用调用以下把它自已成连接者。 PooledConnection.addConnectionE

10、ventListener这样当物理连接变得可用的时候,就会通知给应用服务器。(5)返回给据源情况下一样。客户端的逻辑对象可以使用基本的 Connection API,就如同在普通的数12.1.4连接池和 DataSource 实现通过以上的理解,大家可以看出连接池和 DataSource 的区别:339说 明当客户端没有调用 Connection.时,底层的物理连接是不可重用的。说 明不管池连接对象是从连接池中返回的还是新建的,应用服务器都会在内部下这个连接已经被使用了。第三篇技术一个基于 DataSource 提供的基本的数据源实现有如下特点:l 采用 DataSource.getConne

11、ction()个连接所要做的工作。创建新的物理连接,并且封装了所有建立和管理这l 采用 Connection.()关闭物理连接并且资源。在一个基于连接池的数据源中有很多不可见的实现,这种数据源实现的特点如下:DataSource 实现或者是一个已经实现了的制定连接池模块管理缓冲区的 PooledConnection 对象。DataSource 对象典型的由应用服务器实现作为一层在驱动实现 Connection PoolDataSource 和 PooledConnection 接口的顶层。zDataSource.getConnection 调用 PooledConnection.getConn

12、ection来获得一个指定物z理连接的逻辑句柄,只有当连接池中没有可用的连接时,出现建立新物理连接的花费。当需要一个新的物理连接时,连接池管理器会调用 ConnectionPoolDataSource的 getPooledConnection理。创建。管理物理连接的工作暂由 PooledConnection 对象代Connection.()关闭逻辑句柄,但物理连接还。连接池管理器被通知指定的zPooledConnection 对象现在可以重用了。如果应用程序试图重用逻辑句柄,Connection 实现会抛出一个 SQLException 例外。一个物理(PooledConnection)对象会

13、在生命期内产生许多逻辑(Connection)对象。对 一个给定的 PooledConnection 对象,只有最新生成的逻辑 Connection 对象才有效,当相关的 PooledConnection.getConnection 被调用时。任何先前的 Connection 对象会被自z动关闭,器(连接池管理器)被通知该。Connection.()会关闭逻辑连接,物理连接依然。当底层的池连接对象可用z时,就会通知给连接池管理器。如果应用程序试图重用逻辑句柄那么 Connection 就会抛出一个 SQLException 例外。一个单独的物理池连接对象可以产生多个逻辑连接对象,对于一个给定的

14、池连接对象,只有最经常产生的逻辑对象才是有效的。当 PooledConnection.getConnection 被调用的时z候任何以前的 Connection 对象都会自动关闭。接池管理器通过调用 PooledConnection.下特定环境中被调用:关闭物理连接,该只有在以z¾¾¾当应用服务器遇到正常的关闭当连接缓冲区正在被重新初始化当应用服务器收到一个指出连接出现一个无法恢复的错误时12.1.5包含连接池的数据源配置连接池的使用需要服务器的支持。而目前主流的服务器都支持连接池,并且都提供了 xml文件来方便地配置连接池的参数。本节以 Tomcat 为例,讲解

15、如何配置一个可用的连接池。Tomcat 作为广泛支持的友好服务器,提供两种方式配置连接池数据库:图形界面和 xml文件配置。下面分别进行讲解。3401图形界面本例使用的是 Tomcat5.5 版本,其他版本配置可能略有不同。(1)把 confCatalinalocalhost下面的一个配置文件 admin.xml 放在 Tomcat 安装目录下面的Tomcat 5.5confCatalinalocalhost这个路径下,即和 host-manage.xml, manager.xml 放在一起。然后把 serverwebapps下面的 admin 包拷贝到 Tomcat 安装目录下的 Tomca

16、t 5.5serverwebapps这个路径下面与 host-manager、manager 包放在一块。(2)安装完毕后,重新启动 Tomcat,在地址栏输入。在出现的界面中输入安装 Tomcat 的设置的用户名和。(3)登录后,会出现 Tomcat 的 Web 应用管理界面(Tomcat Web Server AdministrationTool)。单击左边的树结点“Data Source”选项,然后选择右上角的下拉菜单“Create New DataSource”选项,在表格中填写以下:l JNDI Name:/mysql (连接池的名称)l Data Source URL:mysql:

17、/localhost:3306/test (test 为数据库的名称)Driver Class: com mysql.Driverzl User Name: rootl Password: 无l Max. Active Connections: 可用默认值l Max. Idle Connections: 可用默认值l Max. Wait for Connection: 可用默认值l Validation Query: 可不填写。(4)完成后,单击“Save”按钮保存,再单击“Commit Changes”按钮将配置更改提交完成。(5)在<Context></Context&g

18、t;的描述中加上本 Web 应用对全局连接池的说明。(6)完成上述操作后,还需要配置对应 Web 应用的 web.xml。以参考下面的代码。(7)保存 WEB-INFweb.xml 文件。341web-app<!配置资源->resource-ref<!描述 ->descriptionMySQL DataSource example/description<!名称 ->res-ref-name/mysql/res-ref-name<!配置类型->res-typejavax.sql.DataSource/res-type<!配置类型 ->

19、res-authContainer/res-auth/resource-ref/web-app ResourceLink global="/mysql " name="/ mysql" type="javax. sql.Data Source"/第三篇技术2手工配置 server.xml(1)修改 server.xml 的配置,用文本编辑器打开 Tomcat 安装目录下的confserver.xml,找到以下语句:将它改为以下形式,并加入 MySQL 的设置。342<Context path="/myapps"

20、; docBase="myapps" debug="5" reloadable="true" cross Context="true"><Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_ BTest_log."Suffix=".txt" timestamp="true"/><!配置 Mysql -><

21、Resource name="/mysql" auth="Container" type="javax.sql.DataSource"/><ResourceParams name="/mysql"><!配置连接池工厂 -><parameter><name>factory</name><value>mons.dbcp.BasicDataSourceFactory</value></parameter><!配置驱

22、动类 -><parameter><name>driverClassName</name><value> com.mysql.Driver </value></parameter><!配置路径 -><parameter><name>url</name><value>:mysql:/localhost:3306/test </value></parameter><!用户名和-><parameter><name

23、>username</name><value>root</value></parameter><parameter><name>password</name><value> </value></parameter><!配置连接最大等待数,最大活动连接数等 -><parameter><name>maxActive</name><value>20</value></parameter><

24、;parameter><Context path="/myapps" docBase="myapps" debug="5" reloadable="true" crossContext="true">(2)然后再选择应用程序下的WEB-INF下的 web.xml 文件,加入以下配置文件:这样就完成了一个服务器上的数据库连接池的配置。12.1.6池连接对象对于语句的重新利用3.0 对于池的尺度细化到了 Statement 的程度。也就是说,利用 PreparedStatement

25、 对象,就如同重新利用连接一样。3.0 里可以重新在前面的学习中我们知道,在很多情况下重用语句是一个很重要的优化,尤其是对于复杂 的 PreparedStatement 来说。于是,对于企业级的 J2EE 来说,采用 PreparedStatement 缓冲技术, 将极大地提升企业系统的性能。J2EE PreparedStatement 缓冲由 J2EE 服务器内部的连接池管理器使用一个缓冲区来实现。J2EE 服务器在连接池中保存一个所有数据库的预先准备语句的一个列表。当程序调用接的 prepareStatement时,服务器先检查这个语句是否已经,如果已经,相应的驱动程序,PreparedS

26、tatement 在缓冲区内就返回给应用程序。如果不请求/预先准备语句,对象就会加入到缓冲区里。,请求会传递给对于每接我们需要一个缓冲区,因为这是驱动程序的工作要求,任何返回的PreparedStatement 都是这个连接的。343注 意上述代码要加在</web-app>之前。<resource-ref><description>Oracle Datasource example</description><res-ref-name>/mysql</res-ref-name><res-type>javax.s

27、ql.DataSource</res-type><res-auth>Container</res-auth></resource-ref>注 意<ResourceParams name="/mysql">中mysql 是读者命名的,对应到 web.xml 以及JSP页面中中也要用这个名字。<name>maxIdle</name><value>10</value></parameter><parameter><name>maxWait

28、</name><value>10000</value></parameter></ResourceParams><!Mysql end -></Context><!- my DBCP is end ->第三篇技术如果我们要利用缓冲区的优势,就要使用和前面相同的规则。我们需要使用参数化的,这样和已经在缓冲区的某接匹配。大多数应用程序服务器都调整缓冲区的大小。但使用大量的语句,就会消耗系统的资源。12.1.7关闭池连接语句在应用程序使用完数据库后,应该关闭连接,以确保数据库性能的最大化。关闭池连接语句可

29、以采用下面的l 使用 Statement.进行:():Statement 对象的可以被应用程序直接调用,如果语句是在语句池中的,那么关闭的将是逻辑上的语句而不是物理上的语句。l 使用 Connection.():Connection 对象的也是应用程序可以调用的。对于非连接池连接而言关闭的是物理连接,并且关闭所有这个连接所创建的语句。对于池连接只关闭了逻辑连接以及和它相关的逻辑语句,而底层的物理池连接和相关的句被关闭。程序关闭一个池连接语句的和关闭一个非池连接语句的基本是一样的。不管这个语句是不是语句池中的一个语句,被关闭之后都不可以被应用程序继续利用了。如果在已经关闭连接句的情况下,还试图使

30、用该连接池,程序就会抛出一个 SQLExeption 例外。为了养成良编程习惯,建议所有的连接池关闭语句都写在 try catch 语句的 finally 中,这样可以确保数据库连接总能被关闭,不至于在而导致服务器性能下降。途发生异常时,大量连接不关闭12.1.8连接池使用实例当连接池配置完成后,需要使用以下语句来找到容器中的连接池。请读者按照接池配置是否5.1.5 的说明,设置。的数据库连接池,然后使用以下代码来测试数据库连344<%try/初始化连接Connection con; Statement stmt; ResultSet rs;/根据 JDNI 获取连接Context ct

31、x=new InitialContext();DataSource ds=(DataSource)ctx.lookup("java:comp/env/mysqlDB"); con=ds.getConnection();/创建语句stmt=con.createStatement();/执行Context ctx=new InitialContext();DataSource ds=(DataSource)ctx.lookup("java:comp/env/mysqlDB");con=ds.getConnection();12.2分布式事务处理当数据分布在多

32、个数据库服务器上时,就需要各种保护措施来保证数据正确地写到所有数据库中。例如,考虑一个在三个分离的数据库上修改的客户账户平衡表,如果在事务写阶段,任何一个数据库连接失败,数据库之间就失去同步。那么,怎样检测并避免这种情况发生呢?下面将详细解决这种问题的12.2.1XADataSource 接口和 XAConnection 接口1XADataSource 接口使用 XADataSource 接口时,需要用应用服务器的管理工具设置 XADataSource。从应用服驱动程序的文档中可以了解到相关的知识。XADataSource 接口类似于一个在内部务器和使用的 XAConnection 对象的工厂

33、。实现 XADataSource 接口的对象通常在使用 Java Naand Directory InterfaceTM (JNDI)令服务中,可以在应用程序调用时手工创建,例如下面的代码就是创建一个 XADataSource。XADataSource345public DataSource getDataSource() throws SQLException SQLServerDataSource xaDS=SQLServerDataSource(); xaDS.setDataSourceName("SQLServer"); xaDS.setServerName(&qu

34、ot;server"); xaDS.setPortNumber(1433); xaDS.setSelectMethod("cursor");return xaDS;rs=stmt.executeQuery("select * from login");/输出所有结果while(rs.next() out.println(rs.getString(1);%><br><%out.print(rs.getString(2);/关闭资源rs.();stmt.();con.();catch(Exception e) out.pri

35、nt(e.getMessage();%>第三篇技术通常情况下,应用程序很少去管理 XADataSource,而是交给事务管理应用程序服务器去管理,因为它们比一个应用程序更能够高效地管理分布式事务。下面给出一个 JBoss 设置 XADataSource 的配置文件。这里配置的是一台 MS Server 服务器。2XAConnection 接口XAConnection 是一种可以用于分布式事务的 PooledConnection 对象。多层结构中的服务器可以用它来创建返回给应用程序的 Connection 对象。因为是通过扩展 PooledConnection 接口得到的,所以继承了其所有

36、的,另外添加了的getXAResource。虽然 XAConnection 接口从 PooledConnection 接口继承而来,但分布式事务中的数据库连接可以来自连接池模块所管理的连接池。XAConnection 与 PooledConnection 不同。一定要记住 XA 连接参与了 JTA 事务。这意味着 XA 连接不支持的自动提交功能。同时,应用程序一定不要对 XA 连接调用java.sql.Cmit()或者 java.sql.Connection rollback()。相反,应用程序应该使用 UserTranion.begin()、UserTran和 rollback()。mit(

37、)和serTranion()下面的代码展示了如何获取一个 XAConnection,并进一步获取可以执行 SQL 命令的Connection。346/假设 xads 是一个 XADataSource 的驱动实现XADataSource xDB=XADataSource ctx.lookup "/xa/" +"inventory_xa" ;/ xacon 实现了 XAConnectionXAConnection xacon=xDB.getXAConnection "myID", "mypasswd" ;/ 获取实际连

38、接Connection con=xacon.getConnection ;<datasources><xa-datasource><!-配置 JNDI-><jndi-name>MSSQLXADS</jndi-name><track-connection-by-tx/><isSameRM-override-value>false</isSameRM-override-value><!-配置驱动-><xa-datasource-class>net.sourceforge.jtds

39、.x.JtdsDataSource</xa-datasource-class><!-配置主机名和数据库名-><xa-datasource-property name="ServerName">localhost</xa-datasource- property><xa-datasource-property name="DatabaseName">foxtest</xa-datasource- property><!-配置用户名-><user-name>sa&

40、lt;/user-name><password>sa</password><metadata><type-map>MS SQLSERVER2000</type-map></metadata></xa-datasource></datasources>12.2.2事务管理器分布式事务基础设施的首要元素是事务管理器,它可以是 JTA 的具体实现。事务管理器控制着事务边界以及两阶段提交过程。它启动和关闭与分布式事务 XAConnection 对象相关的组件,并跟踪操作参与了分布式事务的 DBMS 服

41、务器。事务管理器在每一个 DBMS 中进行运行决定是否提交事务。当所有的 DBMS 都同意提交滚操作。务管理器才提交事务,否则执行回图 12-2 提供了对于两阶段提交(Two-Phase-Commit)协议如何工作的示例图。分布式事务(Distributed Tran一个分布式事务(Distributed Tranion)使用由元组表示的描述符(例如:x,b1)。其意思是,ion)包含两个元素。首先,有一个惟一全局事务 ID(Global Tranion id)commit x b2 commit x b1Phase2代表分布式事务(Distributed Tranion)的简单标advise

42、 to prepare to commit on x b2 advise to prepare to commit on x b1Phase1识符。由 x 表示,第二个是分支 ID(Branch id),它描modifications on x b2 modifications on x b1述整个事务的一部分。,分支指的是一个数据库的连接。如果有一个将处理两个参与数据库的分布式事务start XA tran ion x b2 start XA tran ion x b1x:"global"tran ion ID b2: tran ion"branch"

43、timex b2(Distributed Tranion),用诸如 100,1 的描述符表示一个数据库,用诸如100,2 的描述符表示另一数据库。因此在本例中,有一个编号为 100 的全局事务,其中包含两个 ID 分别为 1 和 2 的分支。图 12-2两阶段提交中的时间线和应用程序流下面代码展示了一个由事物管理器管理的 JTA 的具体实现,以及两阶段的提交模式。application flow347public void init() throws ServletException /初始化用户业务UserTranion utx = null; try /根据 JNDI 获取一个定义业务In

44、itialContext jndiContext= new InitialContext();utx= (javax.tranion.UserTranion)jndiContext lookup("UserTranion");/开始业务utx.begin();/执行业务insertSQL_(); insertSybase();/提交业务mit(); catch (Exception e) if(utx!=null)utx.rollback();/此处异常代码省略第三篇技术12.2.3关闭连接在一个典型的分布式事务的环境下,当一个程序断开连接的时候,要通知中间层的服务器。在池

45、连接对象的讲解中,我们知道,中间层的服务器会把它加为一个 ConnectionEventListener 对象,所以当程序调用 Conection.()的时候,就会通知它。在分布式的情况下,服务器会通知事务管理器,这样它就可以结束与一个 XAResource 对象相连接的事务分支。如果服务器的 DataSource 实现了接池,那么这个连接池模块就会被告知物理 XAConnction 对象已经返回连接池了。需要注意的是,一个分布式事务在参与到其中的接对象关闭的时候依然是活动的,但是对于局部的事务却正好相反。12.3例 外 处 理在处理了以下关于数据库一个常见的问题就是处理 SQLExcepti

46、on 例外。SQLException 类提供错误的:348private void insertSQL_() throws Exception Connection conn1=createXAConnection("MSSQLXADS"); insertData(conn1); /数据测试,代码省略private void insertSybase()throws Exception Connection conn2=createXAConnection("XASybaseDS"); insertDataSybase(conn2); /数据测试,代码省

47、略throw new Exception(""); /此处做异常测试private Connection createXAConnection(String jndiname)throws Exception InitialContext jndiContext;try /根据 JNDI 获取一个配置连接池jndiContext=new InitialContext();DataSource ds=(DataSource)jndiContext.lookup(jndiname);/返回接return ds.getConnection(); catch (Exception

48、e) e.printStackTrace();return null;l 一个描述错误的字符串。它被用作 Java Exception 消息,并可通过调用 getMesage()使用它。l 一个遵守 XOPEN SQLState 约定的字符串"SQLState"。SQLState 字符串的值由 XOPEN SQL Spec 约定描述。l 一个供应商的整数错误代码。通常它是由当前使用的数据库返回的实际的错误代码。l 到下一个 Exception 的链。它可以用来提供附加的错误。处理 SQLException 的目的最主要的是使数据库数据完整。从用户体验角度上来说,最好不要让最

49、终用户看到这种报错。处理的l 直接将 SQLException 抛向外层l 抛出自定义的异常l 抛出 RuntimeException 异常l 或者其他处理通常有:12.3.1数据警告SQLWarning 是 SQLException 的子类,但结果和其他的例外不一样。它隐式的抛出,重要性程度是否达到了需要调查的地步,取决于操作和上下文。程序员必须明确地索取警告。SQLWarning 非常类似于传统的编译程序警告即发生足以结束处理。当处理以下对象时可能发生产生 SQLWarning:l Connection全正确的某些事情,但严重结果又不l Statement 及其子类型 PreparedSt

50、atement 和 CallableStatementl ResultSet获取 SQLWarning()Connection、Statement 和 ResultSet 都检索 SQLWarning 的 getWarnings()。此外,还有避免检索的 clearWarnings()。SQLWarning 类本身有 getNextWarning() 和 setNextWarning()。clearWarnings()。下面是一个段获取 SQLWarning 的典型代码:349./生成语句stmt=con.createStatement(); sqlw=con.getWarnings(); w

51、hile( sqlw != null)注 意Statement在进行下一个执行时自动地清除警告,而 ResultSet每次新行时都清除警告。API 文档对于 Connection 而言是静态的。为慎重起见,请在警告给出后发布第三篇技术12.3.2数据截断DataTruncation 是 SQLWarning有点特别的子类。它在不同的情况下,会以不同的出现。如果出现在时,则发布 SQLWarning;如果发生在写入/更新时,则给出 SQLException 例外。在实际操作中,它仅仅涉及写入/更新操作,因此通常情况下只需要按 SQLException 的方式进行处理,并始终将 SQLState

52、处于 01004 的状态。数据截断主要表示或写入的要比请求的少。一些数据库/驱动程序会接受超过列容量的数据,它们会将数据截断,再写入已截断数据,并通过 DataTruncation SQLException 报告"You gavemuch data, but I handled it."DataTruncation 类下列与截断数据有关的:l getDataSize()指出目标的字节数的整数l getIndex()给出一个被截断的列或参数的索引值l getParameter()指出是一个列的值还是一个参数值被截断的布尔值l getTransferSize()返回实际传送字节

53、数的整数,如果是-1,则表示字节数未知12.4高级数据类型12.3 节通过一段代码,演示了如何连接数据库并获取其中相关数据。对的数据库操作只是在流程上给出了说明,本章将常用的类和接口,对API 进行详细。12.4.1Java 对象类型由于数据库技术的不断发展,主流的数据库已经具备了直接存取 Java Object 的能力,所以,2.0 以后,也提供了支持存取 Java Object 的数据类型 JAVA_OBJECT。数据库可以使用JAVA_OBJECT 类型来直接在数据库。Java 对象,JAVA_OBJECT 类型的值以某种串行化的形式350/处理 SQLWarinings sqlw=sq

54、lw.getNextWarning();con.clearWarnings(); stmt.executeUpdate( sUpdate ); sqlw=stmt.getWarnings(); while( sqlw != null)/ 处理 SQLWarinings sqlw=sqlw.getNextWarning();catch ( SQLException SQLe). / end catch:在支持 JAVA_OBJECT 值的数据库上,将对象进入数据库时可以使用:某种对象可以使用:或更新数据库中的某个 Object 使用以下:例如,一个 Employee 的类的实例在表 Compan

55、y 的 Employees 列中,可以使用以下获取该对象,并打印其12.4.2SQL3 类型这些高级数据类型到数据库中的主要是使用 PreparedStatement 对象,操作主要是 ResultSet 对象。下面将1BLOB 和 CLOB怎样在数据库中和写入高级数据类型。BLOB 即二进制大对象(Binary Large Object),是一个字节序列(比如说一个 mp3 文件可以为一个 BLOB)。CLOB 是一个对 VARCHAR 或类似的列来说太长的字符串。来自数据库的 BLOB 和 CLOB 数据可以通过 java.sql.Blob 和 java.sql.Clob 对象来操作。Re

56、sultSet 和 PreparedStatement 对象提供的处理这两种数据的l ResultSet 中提供的为:如下:¾¾¾¾Blob getBlob(int) Blob getBlob(string) Clob getClob(int)Clob getClob(String)l PreparedStatement 中提供的Ø void setBlob(int ,Blob)Ø void setClob(int ,Clob)为:使用 setBlob(int,Blob)我们可以用 BLOB 数据来设置准备语句中的占位符,并且可以通过

57、执行 SQL 语句把这些数据写入到另一个表中。例如:351/blob_colum ,id 为 blob_table 这个表的列名String sql="select blob_col from blob_table where id=?" PreparedStatement ps=connection.prepareStatement(sql);说 明第一个参数是 PreparedStatement 中的占位符的索引,以下相同。ResultSet rs=stmt.ExecuteQuery ( "select Employees from Company" ); While(rs.next) Employee emp=Employ

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论