EJB实体Bean动态数据源绑定

http://blog.sina.com.cn/s/blog_5ca9fdd80100bx5f.html

server.xml中Web应用和数据源。在server.xml中加入以下的配置描述。

  例程1 配置web应用

 <Context path="/hibernate" docBase="hibernate" debug="0"         reloadable="true" crossContext="true">
  <Resource name="jdbc/hibernate" auth="Container" type="javax.sql.DataSource"/>   
           <ResourceParams name="jdbc/hibernate">
            <parameter>  
                <name>factory</name>  
             <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>  
            </parameter>
            <parameter>  
               <name>driverClassName</name>  
                  <value>org.gjt.mm.mysql.Driver</value>  
             </parameter>
              <parameter>
                    <name>url</name>  
                    <value>jdbc:mysql:///test</value>   
               </parameter>  
             <parameter>
                  <name>username</name>
                 <value>root</value>
             </parameter>  
            <parameter>
               <name>password</name>  
               <value></value>
                </parameter>  
            <parameter>
            <name>maxActive</name>
            <value>20</value>
          </parameter>
               <parameter>  
              <name>maxIdle</name>  
                 <value>10</value>
          </parameter>
          <parameter>
                <name>maxWait</name>
            <value>-1</value>
          </parameter>  
  </ResourceParams>   
 </Context>

  在这里,配置了一个名为hibernate的Web应用,并且配置了一个数据源,数据源的JNDI名称为jdbc/hibernate。您需要根据情况修改数据源的链接属性。

   6、下一步就是书写Hibernate的配置描述符。可以使用XML的配置描述,也可以使用基于属性的配置描述。在这里使用基于XML的配置描述。在 hibernate\WEB-INF\classes目录下新建一个hibernate.cfg.xml文件。然后加入例程2所示的内容。

<!DOCTYPE hibernate-configuration
          PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">

<hibernate-configuration>
          <session-factory>

        <property name="hibernate.connection.datasource">java:/myDataSource</property>


          <property name="connection.datasource">java:comp/env/jdbc/hibernate</property>
              <property name="show_sql">false</property>
              <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property> //对应数据库方言
              <!-- Mapping files -->
          </session-factory>
</hibernate-configuration>

  注意connection.datasource属性必须和server.xml中配置的数据源的属性一样。如果不是使用MYSQL,那么需要更改dialect属性。

 

 

 

Jndi连接

必要条件:

将mysql-connector-java-3.1.10-bin.jar放到tomcat目录commons/lib下面。这样,当tomcat启动时就可以加载相应的驱动程序。

 

第一、要求web容器(tomcat)里面的conf目录下面的servlet 里面配置节点:

在server.xml中配置全局数据源

在<GlobalNamingResources>下面增加:

<Resource name="jdbc/test" type="javax.sql.DataSource" username="root" password="123456" driverClassName="com.mysql.jdbc.Driver" maxIdle="10" maxWait="50" url="jdbc:mysql://localhost:3306/java308" maxActive="20"/>

 

第二、、要求web容器(tomcat)里面的conf目录下面的

在context.xml中为<Context>增加子元素:

<ResourceLink global="jdbc/test" name="jdbc/test" type="javax.sql.DataSource"/>

再配置好的context.xml 拷入项目中WebRoot下的META-INF中.

 

第三、在hibernate.cfg.xml配置文件中配置如下:

 

 

 

 

 

第四、相关java代码如下:

<%@page import="javax.naming.Context"%>

<%@page import="javax.sql.DataSource"%>

<%@page import="java.sql.Connection"%>

<%@page import="javax.naming.InitialContext"%>

Context context=new InitialContext();

DataSource dataSource=(DataSource)context.lookup("java:comp/env/jdbc/test");

Connection conn=dataSource.getConnection();

 

 

Hibernate的JNDI名称绑定分析

Hibernate的JNDI名称绑定是在net.sf.hibernate.impl.SessionFactoryObjectFactory程序里面实现的,我来分析一下Hibernate的绑定JNDI的过程:

  我们获得SessionFactory一般是这样写代码:

  Configuration conf = new Configuration()。addClass(Cat.class);

  SessionFactory sf = conf.buildSessionFactory();

  首先是new Configuration()创建一个Configuration,在这个构造器里面进行配置文件(hibernate.properties)的读取工作,然后保存到一个Properties对象里面去,和JNDI相关的是这个属性:

  hibernate.session_factory_name hibernate/session_factory

  接着调用buildSessionFactory()方法,该方法检查一下配置信息,然后调用SessionFactoryImpl的一个构造器。在构造器里面注意下面两行代码:

  name = properties.getProperty(Environment.SESSION_FACTORY_NAME);

  SessionFactoryObjectFactory.addInstance(uuid, name, this, properties);

  调用了SessionFactoryObjectFactory的addInstance方法,并且把自身(SessionFactory的实例)作为参数传递。最后在addInstance方法可以看到如下代码:

  Context ctx = NamingHelper.getInitialContext(properties);

  NamingHelper.bind(ctx, name, instance);

  instance 就是SessionFactory的实例,通过读源代码,可以清楚的看到Hibernate是在conf.buildSessionFactory()的时候通过一系列类方法调用,把创建的SessionFactory实例绑定到配置文件(hibernate.properties)中 hibernate.session_factory_name属性指定的名称上的,因此可见Hibernate自身是具有JNDI的动态绑定功能的。但是Hibernate需要获得一个SessionFactory实例用于绑定,而这个SessionFactory实例需要我们写代码进行预先创建,并且必须保证该过程要在所有其它要从JNDI上获得SessionFactory实例的程序之前完成。

  因此对于任何App Server来说,我们都不必去管JNDI名称的绑定过程,只需要保证预先创建一个SessionFactory实例出来就够了,剩下的工作 Hibernate会做的。那么如何确保预创建SessionFactory实例呢,如果是Servlet,可以配置一个初始化的Servlet,只要把

  Configuration conf = new Configuration()。addClass(Cat.class);

  SessionFactory sf = conf.buildSessionFactory();

  这样的代码加进去就可以了。如果是包含EJB的的复杂的J2EE应用,可能需要依靠App Server的功能来保证预创建SessionFactory实例。 

你可能感兴趣的:(EJB实体Bean动态数据源绑定)