JDBC学习

 
1、JDBC的连接有2种:直连;连接池;

       2Weblogic Server中的JDBC配置,包括:配置连接池、配置数据源;

 

 

3、使用连接池的优势:节省时间(初始连接数、最大连接数据)、装用户信息;
       4、连接池、数据源(MySqlJNDI)的配置、程序演示……
              (结合WLS的控制台进行介绍,注意在WLS中添加MY SQL包)
              ……               ……
       5、Weblogic Server中的事务处理
              ①事务的概念:(ACID:原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability)
②分布式事务:事务的参与者、支持事务的服务器、资源服务器、事务管理服务器分别位于不同的分布式系统的不同节点上。通常采用两阶段提交协议:
阶段一:开始向事务涉及到的全部资源发送提交信息,任意一个资源异常就可以决定整个事务取消。否则事务正常执行,并将所有资源的更新写入永久性的日志中;
阶段二:在前阶段没有异常的情况下,所有能被定位和控制的资源管理器都将开始执行真正的数据更新;
   
    6、JDBC中的简单事务
    try {
           ……
           conn.setAutoCommit(false); //禁止自动提交
           ……//SQL语句
           conn.commit( ); //事务提交
    }
    catch(……) {
           ……
           conn.rollback( ); //事务回滚
    }
       7、Weblogic Server中的事务
              J2EE有2套规范来支持分布式事务:
Java Transaction API(JTA):高层与协议、实现无关的API。应用程序和应用服务器可以使用JTA访问事务;
        Java Transaction Service(JTS):是对JTA的实现;WLS同时支持以上2者。
       8、WLS下的JTA开发实例:
              ……
       9、JDBC多池:
多池是连接池的池。连接池中的所有连接共享一个公共的数据库实例和一个公共的用户,以访问资源。借助于多池,可以针对每个连接池使用不同的用户,指向不同的数据库实例。多池基于高可用性和负载均衡算法。
10、如果要在WLS中使用一个没有驱动程序包的JDBC,则要注意把DB的驱动包,配置到StartWeblogic.cmd文件中。
       11、最佳实践:
Ø         在使用连接池之后,应马上关闭连接。
Ø         把数据库连接池的初始容量设置为最大容量。
Ø         建立到数据库的连接时,应使用DataSource技术代替DriverManager这样的老方法。因为后者是一个同步的类,意味着一次只有一个线程执行可以运行。而前者是多线程的。
Ø         应使用正确的顺序(与打开时相反的顺序)来释放来释放JDBC对象,并在JDBC访问的finally块中管理Connection对象。并且在finally的try{}catch{}中,一次只能有一个close()语句,否则,前一个出现异常,后面的语句就不会被执行。
Ø         在WLS中,实现事务有2种方式:使用WLS的JTA驱动程序和JDBC的AutoCommit(false)属性。但是在一个有EJB和JMS服务的企业J2EE中,决不应该使用AutoCommit显示地申明事务,而应该使用JTA驱动程序来实现。

事物的开销十分昂贵,特别是两阶段提交。因此,只有在必须使用事务的时候,才使用事务。要尽可能快地提交或回滚事务。 

程序代码:

文件一、MyContext .java

package study1.Comm;

import javax.naming.*;
import java.util.Properties;

/**
 *说明:
 *     MyContext主要通过getInitialContext()方法获得WLS的上下文环境,以方便JMS、JNDI等各种操作。
 * 编写:
 *     TANMB   2007-10-30
 */

public class MyContext {
 public MyContext() {
 }

 //取得Weblogic Server的初始化环境,以进行JNDI查询。
 public static Context getInitialContext() throws Exception {
  String url = "t3://127.0.0.1:7001";//Weblogic Server的地址、端口号
  String user = "weblogic";//Weblogic Server的用户名和口令
  String password = "weblogic";
  Properties props = null;
  try {
   props = new Properties();
   props.put(Context.INITIAL_CONTEXT_FACTORY,
       "weblogic.jndi.WLInitialContextFactory");
   props.put(Context.PROVIDER_URL, url);
   if (user != null) {
    props.put(Context.SECURITY_PRINCIPAL, user);
    props.put(Context.SECURITY_CREDENTIALS,
        password == null ? "" : password);
   }
   return new InitialContext(props);
  }
  catch (Exception e) {
   System.out.println(e.getMessage());
   throw e;
  }
 }

}

文件二、MyDbcp .java

package study1.DBCP;

import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.util.Properties;
import javax.rmi.PortableRemoteObject;

import study1.Comm.MyContext;

/**
 *说明:
 *    Weblogic Server中DBCP的配置及使用介绍
 *
 *编写:
 *    TANMB     2007-11-1
 */

public class MyDbcp {
 public MyDbcp() {
 }

 public static void main(String[] args) {
  MyDbcp myDbcp1 = new MyDbcp();

  DataSource ds = null;
  Context ctx = null;
  Connection con = null;

  try {
   ctx = MyContext.getInitialContext();
   //MySqlJNDI为数据源在JNDI中的名称
   ds = (javax.sql.DataSource) ctx.lookup("MySqlJNDI");
  }
  catch (Exception ex) {
   System.out.println("Init Error:" + ex);
   ex.printStackTrace();
  }

  Statement statement = null;
  ResultSet rst = null;

  try {
   con = ds.getConnection();
   if (con == null)
    System.out.println("con is null");

   statement = con.createStatement();
   rst = statement.executeQuery("select * from student ");
   while (rst.next()) {
    System.out.print("/t" + rst.getLong("stuid"));
    System.out.print("/t" + rst.getString("stuname"));
    System.out.print("/t" + rst.getInt("departid"));
    System.out.println("/t" + rst.getString("memo"));
   }

   rst.close();
   statement.close();
  }
  catch (Exception ex) {
   System.out.println("Error Code=" + ex.getMessage());
   ex.printStackTrace();
  }
  finally {//注意,释放资源的顺序,和打开的顺序相反。
   try {
    if(rst!=null) rst.close();
   }
   catch (Exception ex) {}

   try {
    if (statement != null) statement.close();
   }
   catch (Exception ex) {}

   try {
    if (con != null) con.close();
   }
   catch (Exception ex) {}
  }

 }
}

JTA

MyJTA .java

package study1.DBCP;

import java.sql.*;
import javax.naming.*;
import javax.sql.*;
import java.util.Properties;
import javax.rmi.PortableRemoteObject;
import javax.transaction.*;

import study1.Comm.MyContext;
/**
 * 说明:
 *     WLS的事务程序示例
 * 编写:
 *     TANMB   2007-11-1
 */

public class MyJTA {
 public MyJTA() {
 }

 public static void main(String[] args) {
  MyJTA myJTA1 = new MyJTA();

  DataSource ds = null;
  Context ctx = null;
  Connection conn = null;
  UserTransaction tx = null;

  try {
   /*
     建立事务:
      在WLS中实现JTA的第一步是创建UserTransaction的实例。UserTransaction事务
     可以控制并发线程的执行。一个事务的并发线程可以是各种服务,如EJB、JDBC、JMS等。
    */
   ctx = MyContext.getInitialContext();
   tx = (UserTransaction) ctx.lookup(
    "javax.transaction.UserTransaction");
            /*
    事务开始。之后针对数据库的任何操作都处于这个事务的范围之内,包括JDBC的调用
      及其它依赖于JDBC的服务。
   */
   tx.begin();
   //查找数据源
   ds = (javax.sql.DataSource) ctx.lookup("MySqlJNDI");
  }
  catch (Exception ex) {
   System.out.println("Init Error:" + ex.getMessage());
   ex.printStackTrace();
  }

  Statement stmt = null;
  ResultSet rst = null;
  try {
   //建立连接
   conn = ds.getConnection();
   //执行与资源有关的操作
   stmt = conn.createStatement();
   stmt.executeUpdate(
    "insert into student values(200801,'stu',1,'test')");
            //如没有异常,则提交事务
   tx.commit();
   System.out.println("*********Success!**********");
  }
  catch (Exception ex) {
   try {
    tx.rollback();//回滚事务
   }
   catch (Exception e) {}
   System.out.println("Error Msg="+ex.getMessage());
  }
  finally {
   try {
    if(stmt!=null)
     stmt.close();
    if(conn!=null)
     conn.close();
   }
   catch (Exception ex) {}
  }

 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值