用JNDI注册MySQL数据源用于Hibernate [英] Registering MySQL DataSource with JNDI for Hibernate

查看:131
本文介绍了用JNDI注册MySQL数据源用于Hibernate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有通过JNDI数据源连接到数据库的hibernate。

我的目的:使用JNDI注册表DataSource来测试DAO层。


$ b 示例

Hibernate配置

 <冬眠-结构> 
< session-factory name =MySessionFactory>
< property name =hibernate.connection.datasource> java:jdbc / MysqlMyDS< / property>
< property name =hibernate.connection.driver_class> com.mysql.jdbc.Driver< / property>
<! - 映射.... - >
< / hibernate-configuration>

获取测试类中的SessionFactory:

 配置cgf = new Configuration()。configure(/ META-INF / hibernate.cfg.xml); 
SessionFactory iceleadsSessionFactory = cgf.buildSessionFactory();

结果如下:

pre > 16:04:37,753错误DatasourceConnectionProvider:78 - 无法找到数据源:java:jdbc / MysqlIceleadsDS
javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名称,或者applet参数或应用程序资源文件中:java.naming.factory.initial

要注册JNOI我使用示例( http://www.roseindia.net/tutorial/java/jdbc )

  import java.rmi.RemoteException; / /注意: 
import java.rmi.registry.LocateRegistry;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.ConnectionPoolDataSource;

import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class RegisteringJNDIWithDataSource {
private static void startRegistry()throws RemoteException {
System.out.println(LocateRegistry.getRegistry());
LocateRegistry.createRegistry(1059);
System.out.println(RMI registry Stared。);


private static InitialContext createInitialContextContext()
throws NamingException {
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
com.sun.jndi.rmi.registry.RegistryContextFactory);
properties.put(Context.PROVIDER_URL,rmi:// localhost:1059);
InitialContext initialContextcontext = new InitialContext(properties);
返回initialContextcontext;


public static void main(String args []){
try {
startRegistry();
ConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
((MysqlDataSource)dataSource).setUser(root);
((MysqlDataSource)dataSource).setPassword(root);
((MysqlDataSource)dataSource).setServerName(192.168.10.13);
((MysqlDataSource)dataSource).setPort(3306);
((MysqlDataSource)dataSource).setDatabaseName(student);

InitialContext context = createInitialContextContext();
context.rebind(Source,dataSource);

catch(Exception e){
System.out.println(e.getMessage());
}
}
}

请建议解决方案。谢谢!

如果您正确设置 jndi.properties 。这个文件应该在classpath中。



这里是工作示例:

服务器:

  public static void main(String [] args)throws Exception {
LocateRegistry.createRegistry(1099);
ConnectionPoolDataSource dataSource = createDataSource(root,);

InitialContext context = createContext();
context.bind(MysqlMyDS,dataSource);
System.out.println(context created!);


$ b private static InitialContext createContext()throws NamingException {
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,com.sun.jndi.rmi.registry.RegistryContextFactory);
env.put(Context.PROVIDER_URL,rmi:// localhost:1099);
InitialContext context = new InitialContext(env);
返回上下文;


private static ConnectionPoolDataSource createDataSource(String username,String password){
MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
dataSource.setUser(username);
dataSource.setPassword(password);
dataSource.setServerName(localhost);
dataSource.setPort(3306);
dataSource.setDatabaseName(test);
返回dataSource;

客户端:



hibernate.cfg.xml注意:datasource jndi name应该与您通过 context.bind()

设置完全相同

 <?xml version ='1.0'encoding ='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC
- // Hibernate / Hibernate配置DTD 3.0 // EN
http://hibernate.sourceforge.net/hibernate-configuration-3.0 .dtd>
< hibernate-configuration>
< session-factory>
< property name =hibernate.connection.datasource> MysqlMyDS< / property>
< property name =hibernate.connection.driver_class> com.mysql.jdbc.Driver< / property>
< / session-factory>
< / hibernate-configuration>

jndi.properties(如果需要,可以用代码或-D选项设置)

  java.naming.factory.initial = com.sun.jndi.rmi.registry.RegistryContextFactory 
java.naming。 provider.url = rmi:// localhost:1099

单元测试

  public class TestClient {
@Test $ b $ public void testCfg()throws Exception {
Configuration cgf = new Configuration()。配置( / hibernate.cfg.xml中);
cgf.buildSessionFactory();
}
}


I have hibernate which connect to database via JNDI datasource.

My purpose: registry DataSource with JNDI to test DAO layer.

Example

Hibernate config

<hibernate-configuration>
    <session-factory name="MySessionFactory">
        <property name="hibernate.connection.datasource">java:jdbc/MysqlMyDS</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- mappings .... ->
</hibernate-configuration>

Get SessionFactory in test class :

Configuration cgf = new Configuration().configure("/META-INF/hibernate.cfg.xml");
SessionFactory iceleadsSessionFactory = cgf.buildSessionFactory();

As the result:

16:04:37,753 ERROR DatasourceConnectionProvider:78 - Could not find datasource: java:jdbc/MysqlIceleadsDS
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

To register JNOI I use example (http://www.roseindia.net/tutorial/java/jdbc/registeringthedatasourcewithjndi.html)

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.ConnectionPoolDataSource;

import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class RegisteringJNDIWithDataSource {
        private static void startRegistry() throws RemoteException {
                System.out.println(LocateRegistry.getRegistry());
                LocateRegistry.createRegistry(1059);
                System.out.println("RMI registry Stared.");
        }

        private static InitialContext createInitialContextContext()
                        throws NamingException {
                Properties properties = new Properties();
                properties.put(Context.INITIAL_CONTEXT_FACTORY,
                                "com.sun.jndi.rmi.registry.RegistryContextFactory");
                properties.put(Context.PROVIDER_URL, "rmi://localhost:1059");
                InitialContext initialContextcontext = new InitialContext(properties);
                return initialContextcontext;
        }

        public static void main(String args[]) {
                try {
                        startRegistry();
                        ConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
                        ((MysqlDataSource) dataSource).setUser("root");
                        ((MysqlDataSource) dataSource).setPassword("root");
                        ((MysqlDataSource) dataSource).setServerName("192.168.10.13");
                        ((MysqlDataSource) dataSource).setPort(3306);
                        ((MysqlDataSource) dataSource).setDatabaseName("student");

                        InitialContext context = createInitialContextContext();
                        context.rebind("Source", dataSource);

                } catch (Exception e) {
                        System.out.println(e.getMessage());
                }
        }
}

Please suggest solution. Thanks!

解决方案

Your code will work, if you correctly set jndi.properties. This file should be in classpath.

here is working example:

Server:

    public static void main(String[] args) throws Exception{
        LocateRegistry.createRegistry(1099);
        ConnectionPoolDataSource dataSource = createDataSource("root", "");

        InitialContext context = createContext();
        context.bind("MysqlMyDS", dataSource);
        System.out.println("context created!");

    }

    private static InitialContext createContext() throws NamingException {
        Properties env = new Properties();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
        env.put(Context.PROVIDER_URL, "rmi://localhost:1099");
        InitialContext context = new InitialContext(env);
        return context;
    }

    private static ConnectionPoolDataSource createDataSource(String username, String password) {
        MysqlConnectionPoolDataSource dataSource = new MysqlConnectionPoolDataSource();
        dataSource.setUser(username);
        dataSource.setPassword(password);
        dataSource.setServerName("localhost");
        dataSource.setPort(3306);
        dataSource.setDatabaseName("test");
        return dataSource;
    }

client:

hibernate.cfg.xml Note: datasource jndi name should be exactly as you set it by context.bind()

<?xml version='1.0' encoding='utf-8'?>
        <!DOCTYPE hibernate-configuration PUBLIC
                "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <property name="hibernate.connection.datasource">MysqlMyDS</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
</session-factory>
</hibernate-configuration>

jndi.properties (if you want, you can set it in code or with -D option)

java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory
java.naming.provider.url=rmi://localhost:1099

unit test

public class TestClient {
    @Test
    public void testCfg() throws Exception {
        Configuration cgf = new Configuration().configure("/hibernate.cfg.xml");
        cgf.buildSessionFactory();
    }
}

这篇关于用JNDI注册MySQL数据源用于Hibernate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆