`
sunday132
  • 浏览: 51160 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Java 连接 Oracle 数据库

阅读更多

1.Java程序连接数据库的四种方法
1  JDBC-ODBC桥和ODBC驱动程序--在这种方式下,这是一个本地解决方案,因为ODBC驱动程序和桥代码必须出现在用户的每台机器中。从根本上说这是一个临时解决方案。
2  本机代码和Java驱动程序--它用另一个本地解决方案(该平台上的Java可调用的本机代码)取代 ODBC 和 JDBC-ODBC 桥。
3  JDBC网络的纯Java驱动程序--由Java驱动程序翻译的JDBC形成传送给服务器的独立协议。然后,服务器可连接任何数量的数据库。这种方法使您可能从客户机Applet中调用服务器,并将结果返回到您的Applet。在这种情况下,中间件软件提供商可提供服务器。
4  本机协议Java驱动程序-- Java驱动程序直接转换为该数据库的协议并进行调用。这种方法也可以通过网络使用,而且可以在Web浏览器的Applet中显示结果。在这种情况下,每个数据库厂商将提供驱动程序。


2.使用连接池和语句池 提高 Oracle 驱动的 JDBC 程序的性能
    使用诸如连接池和语句池等池技术可以显著提高数据库密集型应用程序的性能,因为这样可以实现对象重用,而无需花费时间和资源重新创建对象。
如果应用程序与数据库频繁交互并且经常使用相同的参数重新建立连接,那么重用表示应用程序使    用的物理数据库连接的数据库连接对象可显著提高性能。反之,如果应用程序与其基础数据库很少连接,您不会因使用连接池获益。实际上,如果池的设置(例如,允许的最大或最小连接数限制)针对特定应用程序进行了优化,许多数据库密集型应用程序都可以因使用连接池获益。
    与连接池一样,语句池也是用于提高应用程序性能的技术。通过在应用程序运行期间多次执行语句池,可以进一步提高性能。然而,我们应该意识到语句池并不是解决性能问题的灵丹妙药。如果对每条语句进行缓存而不辨别其在程序中执行的次数,则不可能获得任何性能改进。实际上,由于将语句放入缓存并保存在缓存中将产生开销,因此对在程序执行期间仅执行一次的语句进行缓存将降低性能。

 

3.准备好驱动和连接池
准备数据库驱动:
由于安装的数据库是oracle10g个人版,这里下载的是oracle10g瘦版JDBC(相当于前面Java数据库连接方式的第四种)地址是:
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc_10201.html

准备数据库连接池
DBCP是apache的数据库连接池项目,其依赖于commons-pool 下载地址是:
http://commons.apache.org/dbcp/download_dbcp.cgi
http://commons.apache.org/pool/downloads.html

 

4.初始化连接代码

 

import org.apache.commons.dbcp.BasicDataSource;
import java.sql.SQLException;
import java.sql.Connection;
/**
 * 使用DBCP 1.4 做数据库连接池 DBCP1.4支持JDK1.6
*/
public class Dbcp extends DBConnection
{
    private BasicDataSource dataSource = null;
 
    // 初始化数据连接
  public void initDataSource()
   {
         if (dataSource != null)
        {
             try
            {
                dataSource.close();
            }
            catch (Exception e)
           {
               e.printStackTrace();
           }
           dataSource = null;
       }

       try
      {     
          dataSource = new BasicDataSource();
         dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
         dataSource.setUrl("jdbc:oracle:thin:@127.0.0.1:1521:XE");
         dataSource.setUsername("name");
         dataSource.setPassword("password");
         dataSource.setMaxActive(20);
         dataSource.setMaxIdle(10);
      }
      catch (Exception e)
     {
         e.printStackTrace();
     }
   }

    // 从连接池中获得数据库连接
  public Connection getConnection() throws SQLException 
   {
        if (dataSource != null)
       {
            return dataSource.getConnection();
       }
       else
       {
            throw new SQLException("数据源不存在");
       }
  }
}

 

 
5.测试代码

 

/**
 * Java调用Oracle的存储过程
 */
static void callableSatement()
{
  Connection con = null;
  CallableStatement callStmt = null;

  try
  {
       con = DBService.getInstance().getConnection();
       System.out.println("创建连接成功");
       // 调用Oralce的存储过程luketest(?)
       callStmt = con.prepareCall("BEGIN luketest(?); END;");
       callStmt.setInt(1, 682);
       System.out.println("调用Oralce的存储过程");

       callStmt.execute(); /* 如果这里阻塞说明上面的store procedure正被独占访问/或者事务没有提交 */
       System.out.println("存储过程执行成功");
   }
    catch (SQLException e)
   {
       e.printStackTrace();
   }
   finally
   {
        try
       {
              if (callStmt != null)
                    callStmt.close();
              if (con != null)
                    con.close();
       }
       catch (SQLException ex)
       {
              ex.printStackTrace();
       }
  }
}

/**
 * 执行预编译SQL语句
 */
static void preparedStatement()
{
      // 表示预编译的 SQL 语句的对象。
    // SQL 语句被预编译并且存储在 PreparedStatement 对象中。然后可以使用此对象高效地多次执行该语句。
    Connection conn = null;
      PreparedStatement prepStmt = null;
      ResultSet set = null;
      try
      {
             conn = DBService.getInstance().getConnection();
             prepStmt = conn.prepareStatement("select * from account_info where account_id=5000007");
             set = prepStmt.executeQuery();
	    
             while (set.next())
             {
                   System.out.print(" " + set.getInt("account_id"));
                   System.out.print(" " + set.getString("account_name"));
                   System.out.println(" " + set.getString("account_password"));
             }
       }
       catch (SQLException e)
       {
            e.printStackTrace();
       }
       finally
       {
              try
              {
                       if (set != null)
                            set.close();
                       if (prepStmt != null)
                             prepStmt.close();
                       if (conn != null)
                             conn.close();
               }
               catch (Exception e)
               {
                       e.printStackTrace();
               }
       }
}

/**
 * 执行SQL
 */
static void statement()
{
      // 执行大量的查询语句
    for (int i = 0; i < 100; i++)
      {
              Connection conn = null;
              Statement stmt = null;
              ResultSet set = null;
              try
              {
                    conn = DBService.getInstance().getConnection();
                    stmt = conn.createStatement();
                    set = stmt.executeQuery("select * from account_info where account_id=5000007");
                    while (set.next())
                    {
                           System.out.print(i + " " + set.getInt("account_id"));
                           System.out.print(" " + set.getString("account_name"));
                           System.out.println(" " + set.getString("account_password"));
                    }
                }
                catch (SQLException e)
                {
                       e.printStackTrace();
                }
                finally
                {
                       try
                       {
                              if (set != null)
                                      set.close();
                              if (stmt != null)
                                      stmt.close();
                              if (conn != null)
                                      conn.close();
                       }
                       catch (Exception e)
                       {
                               e.printStackTrace();
                       }
                }
         }
}

 

 
6.分析效率


Java中对于执行SQL语句接口设计如下:
java.sql.Statement
java.sql.PreparedStatement extends Statement
java.sql.CallableStatement extends PreparedStatement


为了进一步了解用法,下面直接复制了JDK的文档,JDK文档描述如下:

 

public interface Statement
用于执行静态 SQL 语句并返回它所生成结果的对象。
在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。
优势:在执行单独的一条简单的SQL效率最高。

 

public interface PreparedStatement extends Statement
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并且存储在 PreparedStatement 对象中。然后可以使用此对象高效地多次执行该语句。
在以下设置参数的示例中,con 表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("update employees set salary=? where id =? ");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
pstmt.executeUpdate();
优势:可以显著提高执行多条语句相同而参数不同的SQL的效率。
在多次执行同样SQL语句而参数不同的情况下,可以使用setXXX()方法来动态的改变参数,而不用像Statement那样每次都要生成新的SQL语句。

 

public interface CallableStatement extends PreparedStatement
用于执行 SQL 存储过程的接口。JDBC API 提供了一个存储过程 SQL 转义语法,该语法允许对所有 RDBMS 使用标准方式调用存储过程。
优势:适合于对不同数据表的频繁访问并且逻辑操作复杂的情况。java只需要简单的调用一下数据库中定义好的存储过程并传递相应参数,剩下的操作都有数据库自己去执行这样减少Java与数据库之间的交互次数。

 

参考网址
www.ibm.com/developerworks/cn/java
www.oracle.com/cn/
JDK6.0中文文档

10
3
分享到:
评论

相关推荐

    java连接oracle数据库jar包

    Java连接Oracle数据库主要依赖于JDBC(Java Database Connectivity)技术,这是Java平台中用于与各种数据库进行交互的一套标准API。Oracle公司提供了JDBC驱动,使得Java程序能够方便地访问Oracle数据库。在Java中...

    Java连接Oracle数据库的各种方法

    Java连接Oracle数据库主要依赖于两种方法:JDBC和SQLJ。这两种方法都是Oracle8i及其后续版本中为Java开发者提供的数据库交互方式。 JDBC(Java Database Connectivity)是一种标准的Java API,它允许Java应用程序...

    java连接oracle数据库

    ### 使用Java连接Oracle数据库 #### 一、简介与准备工作 在进行Java程序开发时,经常需要与数据库进行交互。Oracle数据库作为业界广泛使用的数据库之一,掌握如何使用Java连接Oracle数据库是一项重要的技能。本文...

    Java连接oracle数据库实现成绩查询

    总的来说,这个Java连接Oracle数据库实现成绩查询的课程设计涵盖了数据库设计、JDBC编程、面向对象设计、权限控制等多个IT领域的知识,是学习和实践数据库应用开发的良好实例。通过这个项目,开发者不仅能提升数据库...

    Java连接Oracle数据库的各种方法.doc

    本文主要探讨的是Java连接Oracle数据库的方法,包括JDBC和SQLJ,以及Oracle JDBC驱动的三种类型。 首先,Java与Oracle的接口使得在数据库中运行Java成为可能。Oracle8i引入了这一特性,允许开发者在应用程序中利用...

    java连接oracle数据库实例及所需jar文件

    本实例将详细介绍如何使用Java连接Oracle数据库,并提供所需的jar文件——`classes14.jar`。 首先,为了在Java中与Oracle数据库建立连接,我们需要引入Oracle的JDBC驱动程序。`classes14.jar`就是Oracle JDBC驱动的...

    java连接oracle数据库代码

    java连接oracle数据库代码

    Java连接Oracle数据库驱动包(JDBC)

    Java连接Oracle数据库的过程中,JDBC(Java Database Connectivity)扮演了至关重要的角色。JDBC是Java平台的一个标准API,它允许Java程序与各种数据库进行交互,包括Oracle。在本压缩包中,提供了Java连接Oracle...

    java连接oracle数据库驱动

    java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle数据库驱动器java连接oracle...

    JAVA 连接oracle数据库工程

    本项目“JAVA 连接oracle数据库工程”将详细阐述如何使用Java在MyEclipse环境下连接到Oracle数据库。 首先,我们需要理解Java与Oracle数据库之间的连接基础。Java通过JDBC(Java Database Connectivity)API与各种...

    JAVA 连接oracle数据库 实现简单的查询

    在Java编程中,连接Oracle数据库并执行...总的来说,Java连接Oracle数据库并进行查询涉及到JDBC API的使用,包括加载驱动、建立连接、执行SQL和处理结果。理解这些步骤和概念对于任何Java开发者来说都是基础且重要的。

    java 连接Oracle数据库

    总的来说,Java连接Oracle数据库涉及到的知识点包括:Oracle数据库的安装和配置、JDBC驱动的使用、Java数据库连接(JDBC)API、异常处理以及数据库操作的最佳实践。通过学习和实践这些内容,你可以熟练地在Java应用...

    JAVA连接Oracle数据库需要用到的jar文件

    本文将详细介绍如何使用Java连接Oracle数据库以及所需的JAR文件。 首先,Oracle提供了两种类型的JDBC驱动程序: 1. ** Thin Driver (纯Java驱动)**:也称为类型4驱动,它是一个完全用Java编写的轻量级驱动,不需要...

    java连接Oracle数据库

    Java连接Oracle数据库是Java开发中的常见任务,尤其在企业级应用中,Oracle数据库因其稳定性、高性能和丰富的功能而被广泛采用。在这个简单的demo中,我们将深入探讨如何使用Java Database Connectivity (JDBC) API...

    java连接oracle数据库的驱动包

    本文将深入探讨如何使用Java连接Oracle数据库,以及如何处理所需的驱动包。 首先,Java Database Connectivity (JDBC) 是Java平台的标准API,用于与各种数据库进行通信。它为开发人员提供了一组接口和类,通过这些...

    JAVA连接ORACLE数据库

    本实例将详细介绍如何使用JAVA连接Oracle数据库,并通过连接池管理数据库连接。 首先,我们要了解JAVA中的JDBC(Java Database Connectivity),它是JAVA平台标准的一部分,提供了与各种数据库交互的能力。在JAVA...

Global site tag (gtag.js) - Google Analytics