JDBC连接oracle数据库_第1页
JDBC连接oracle数据库_第2页
JDBC连接oracle数据库_第3页
JDBC连接oracle数据库_第4页
JDBC连接oracle数据库_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、JDBC连接oracle数据库(资料整理)JSP+JDBC(Thin 模式)连接 Oracle在JSP中连接到Oracle 一般有2种方式:1、Oracle JDBC 的 oci8 方式2、Oracle JDBC 的 thin 方式我比较喜欢第2种,因为WEB发布服务器与数据库服务器一般都不会放在同一台电脑中,而在使用thin方式连接时,WEB报务器端无须安装 oracle的客户端。在动手先代码之前,我们先把环境配置妥善。先从安装了Oracle的数据库服务器中,找到 Oracle安装目录,然后将该目录下的jdbclibclasses12.jar文件拷贝到 WEB发布服务器的某个目录。假设就直接

2、放在根目录下吧,然后把该路径添加到,系统-高级-环境变量 伸变量名为,CLASSPATH?的值中,如:D:Program FilesSQLLIBjavadb2java.zip;D:Program Tles'SQLLIBjavaruntime.zip;c:classes12.jar;也就是让 java 能够找到这个包。配置好环境后,我们就开始开始动手写代码了。关于数据库连接的代码,应该写个专门的连接类来调用,没必要想网络上有 些文章那样,直接写到JSP的代码中。关于连接的代码很简单private Connection newConnection(String user,String pa

3、ssword) ( Connection con = null;try (Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();con = DriverManag er.getConnection ("jdbc:oracle:thin::1521:oracle9i" ,user,password);catch (SQLException e) ( return null;return con; 如果帐号密码没有错,那这个函数就应该能返回个可用的连接。但如此简单

4、的连接在一个项目中使用,是远远达不到效果的。我们可以在这个数据库连接类中加入更多的功能,如连接池等等。下面我就把该数据库连接类的代码详细的列出来,大家可以参考参考/* Title公司网站* Author: zf* Version 1.0* Memo:定义数据库连接及其数据库连接池等*/package com.kingson.db;mport java.io.*;mport java.sql.*;mport java.util.*;mport java.util.Date;public class DBConnectionManager static private DBConnectionMa

5、nager instance; /唯一实例 static private int clients;private Vector drivers = new Vector();private PrintWriter log;private Hashtable pools = new Hashtable();/*返回唯一实例.如果是第一次调用此方法,则创建实例* return DBConnectionManager 唯一实例*/static synchronized public DBConnectionManager getInstance() f (instance = null) nstan

6、ce = new DBConnectionManager();clients+;eturn instance;/*建构函数私有以防止其它对象创建本类实例*/private DBConnectionManager() nit();/*'将连接对象返回给由名字指定的连接池* param name在属性文件中定义的连接池名字* param con 连接对象*/public void freeConnection(String name, Connection con) (DBConnectionPool pool = (DBConnectionPool) pools.get(name);f

7、(pool != null) (pool.freeConnection(con);/*获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数*限制,则创建并返回新连接* param name在属性文件中定义的连接池名字* return Connection 可用连接或 null*/public Connection getConnection(String name) (DBConnectionPool pool = (DBConnectionPool) pools.get(name);f (pool != null) (eturn pool.getConnection()

8、;return null;/*获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,*则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.* param name连接池名字* param time以毫秒计的等待时间* return Connection 可用连接或 null*/public Connection getConnection(String name, long time) (DBConnectionPool pool = (DBConnectionPool) pools.get(name);f (pool != null) (return pool.getC

9、onnection(time);return null;*关闭所有连接,撤销驱动程序的注册*/public synchronized void release() (,/等待直到最后一个客户程序调用f (-clients != 0) (eturn;Enumeration allPools = pools.elements();while (allPools.hasMoreElements() DBConnectionPool pool = (DBConnectionPool) allPools.nextElement();pool.release();Enumeration allDriver

10、s = drivers.elements();while (allDrivers.hasMoreElements() Driver driver = (Driver) allDrivers.nextElement();try DriverManager.deregisterDriver(driver);og("撤销 JDBC 驱动程序”+ driver.getClass().getName()+”的注册");catch (SQLException e) og(e,”无法撤销下列 JDBC 驱动程序的注册:"+ driver.getClass().getName()

11、;/*根据指定属性创建连接池实例.* param props连接池属性*/private void createPools(Properties props) Enumeration propNames = pertyNames();while (propNames.hasMoreElements() String name = (String) propNames.nextElement();f (name.endsWith(".url") String poolName = name.substring(0, name.lastIndexOf(&quo

12、t;.");String url = props.getProperty(poolName + ".url");f (url = null) og("没有为连接池"+ poolName + "指定URL");continue;String user = props.getProperty(poolName + ".user");String password = props.getProperty(poolName + ".password");String dbip = props.

13、getProperty(poolName + ".db_ip”, ”");String dbport = props.getProperty(poolName + ".db_port", "1521");String dbuid = props.getProperty(poolName + ".db_uid", "ORACLE9I");String maxconn = props.getProperty(poolName + ".maxconn", &

14、quot;0");,/连接信息String dbInfo = user + "/" + password + "" + dbip + ":" + dbport + ":" + dbuid; nt max;try (max = Integer.valueOf(maxconn).intValue();catch (NumberFormatException e) (og("错误的最大连接数限制:"+ maxconn + ".连接池:"+ poolName);max =

15、0;DBConnectionPool pool = new DBConnectionPool(poolName, url,dbInfo, max);pools.put(poolName, pool);og("成功创建连接池"+ poolName);/*读取属性完成初始化*/private void init() (nputStream is = getClass().getResourceAsStream("perties");Properties dbProps = new Properties();try (dbProps.load(is

16、);catch (Exception e) (System.err.println("不能读取属性文件."+”请确保perties在CLASSPATH 指定的路径中");eturn;String logFile = dbProps.getProperty("logfile", "newslog.txt");try (og = new PrintWriter(new FileWriter(logFile, true), true);catch (IOException e) (System.err.println(

17、"无法打开日志文件:"+ logFile);og = new PrintWriter(System.err);oadDrivers(dbProps);createPools(dbProps);/*装载和注册所有JDBC驱动程序* param props 属性*/private void loadDrivers(Properties props) String driverClasses = props.getProperty("driver");StringTokenizer st = new StringTokenizer(driverClasses)

18、;while (st.hasMoreElements() String driverClassName = st.nextToken().trim();try Driver driver = (Driver)Class.forName(driverClassName).newInstance();DriverManager.registerDriver(driver);drivers.addElement(driver);og("成功注册 JDBC 驱动程序"+ driverClassName);catch (Exception e) og("无法注册JDBC驱动

19、程序:"+driverClassName + ",错误:"+ e);/*将文本信息写入日志文件*/private void log(String msg) og.println(new Date() + ": " + msg);/*将文本信息与异常写入日志文件*/private void log(Throwable e, String msg) og.println(new Date() + ": " + msg);e.printStackTrace(log);*连接池类 */*此内部类定义了一个连接池.它能够根据要求创建新

20、连接,直到预定的最*大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性.*/class DBConnectionPool (private int checkedOut;private Vector freeConnections = new Vector();private int maxConn;private String name;private String URL;private String dbInfo;/*创建新的连接池* param name连接池名字* param URL 数据库的 JDBC URL* param dbInfo 数据库连接信息* param m

21、axConn此连接池允许建立的最大连接数*/public DBConnectionPool(String name, String URL, String dbInfo, int maxConn) ( = name;this.URL = URL;this.dbInfo = dbInfo;this.maxConn = maxConn;/*将不再使用的连接返回给连接池* param con客户程序释放的连接*/public synchronized void freeConnection(Connection con) (,/将指定连接加入到向量末尾TeeConnections

22、.addElement(con);checkedOut-;notifyAll();/*从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接*数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之*然后递归调用自己以尝试新的可用连接*/public synchronized Connection getConnection() ( Connection con = null;f (freeConnections.size() > 0) (/获取向量中第一个可用连接con = (Connection) freeConnections.firstElement();

23、freeConnections.removeElementAt(0);try (f (con.isClosed() (og("从连接池”+ name+"删除一个无效连接");,/递归调用自己,尝试再次获取可用连接con = getConnection();catch (SQLException e) (og("从连接池"+ name+"删除一个无效连接");,/递归调用自己,尝试再次获取可用连接con = getConnection();else if (maxConn = 0 | checkedOut < maxCo

24、nn) (con = newConnection();f (con != null) (checkedOut+;eturn con;/*从连接池获取可用连接.可以指定客户程序能够等待的最长时间*参见前一个getConnection()方法.* param timeout以毫秒计的等待时间限制*/public synchronized Connection getConnection(long timeout) ( ong startTime = new Date().getTime();Connection con;while (con = getConnection() = null) (t

25、ry (wait(timeout);catch (InterruptedException e) f (new Date().getTime() - startTime) >= timeout) (/ wait()返回的原因是超时eturn null;eturn con;/*关闭所有连接*/public synchronized void release() (Enumeration allConnections = freeConnections.elements();while (allConnections.hasMoreElements() (Connection con = (

26、Connection) allConnections.nextElement();try (con.close();og("关闭连接池”+ name+"中的一个连接");catch (SQLException e) (og(e,"无法关闭连接池"+ name+"中的连接");,:reeConnections.removeAl l Elements();/*创建新的连接*/private Connection newConnection() (Connection con = null;try (con = DriverMan

27、ager.getConnection(URL+dbInfo);og("连接池"+ name+"创建一个新的连接");catch (SQLException e) (og(e,"无法创建下列 URL的连接:"+ URL);return null;return con;笥单连接1、加载一个对应数据库的JDBC驱动Oracle8/8i/9i 数据库(thin 模式)Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();String url="

28、;jdbc:oracle:thin:localhost:1521:orcl”;,/orcl为数据库的SIDString user="test"String password="test”;Connection conn= DriverManager.getConnection(url,user,password);列如:public Connection getConnection()tryClass.forName("oracle.jdbc.driver.OracleDriver");Connection conn=DriverManager

29、.getConnection("jdbc:oracle:thin:3:1521:SDPSTDB”,"middb”,"middb");return conn;catch(java.lang.ClassNotFoundException e)System.err.println("mydb();"+e.getMessage();return null;catch(java.sql.SQLException e)System.err.println("db();"+e.getMessage();re

30、turn null;通过JDBC连接oracle数据库的十大技巧Java数据库连接(JDBC) API是一系列能够让Java编程人员访问数据库的接口,各个开发商的接口并不完全相同。在使用 多年的Oracle公司的JDBC后,我积累了许多技巧,这些技巧能够使我们更好地发挥系统的性能和实现更多的功能。1、 在客户端软件开发中使用Thin驱动程序在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择 OCI驱动程序或Thin驱动程亨

31、。OCI驱动程序利用Java本地化接口( JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序的性能都超过了OCI驱动程序。2、关闭自动提交功能,提高系统性能在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如

32、下所示:conn.setAutoCommit(false);值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对暮务进行管理。3、 在动态SQL或有时间限制的命令中使用Statement对象在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用 Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个 SQL命令时,都会对它进行解析和编译。这可能会使你认为, 使用Pre

33、paredStatement对象比使用Statement对象的速度更快。 然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理 SQL命令,我们应当考虑使用Statemen对象。此外,使用Statement对象也使得编写动态 SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。4、利用helper函数对动态SQL命令进行格式化在创建使用Statement对象执行的动态 SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一

34、个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“'号替换O'Reilly中的“'号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的 helper方法。与此类似的是,我们可以让helper方法接受一个 Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。5、利用PreparedStatement对象提高数据库的总体效率在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每

35、当执行司一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于 Statement任务,我会建议在除动态 SQL命令之外的所有情况下使用PreparedStatement对象。6、 在成批处理重复的插入或更新操作中使用PreparedStatement对象如果成批地处理插入和更新操作

36、,就能够显著地减少它们所需要的时间。Oracle提供的Statement和CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用 addBatch()和executeBatch()方法选择标准的 JDBC批处理,或者通过利用 PreparedStatement对象的setExecuteBatch()方法和标准的 executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():PreparedStatement pstmt3D null; try (OraclePreparedStatement)pstmt).setExecuteBatch(30);.pstmt.executeUpdate()

温馨提示

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

评论

0/150

提交评论