当前位置: 首页 > 面试题库 >

使用JNDI为Hibernate注册MySQL数据源

郎伟兆
2023-03-14
问题内容

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

我的目的:使用JNDI注册数据源以测试DAO层。

hibernate配置

<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>

在测试类中获取SessionFactory:

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

作为结果:

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

要注册JNOI,我使用示例(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());
                }
        }
}

请提出解决方案。谢谢!


问题答案:

如果设置正确,您的代码将起作用jndi.properties。该文件应位于类路径中。

这是工作示例:

服务器:

    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;
    }

客户:

hibernate.cfg.xml注意:数据源jndi名称应与您设置的名称完全相同 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(如果需要,可以在代码中或使用-D选项进行设置)

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

单元测试

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


 类似资料:
  • 我一直在尝试将mysql配置为WildFly中的数据源。我不确定我错过了什么,我得到一个错误启动。 我在文件夹“/wildfly-8.1.0.final/module/system/layers/base/com/mysql/main”中有mysql-connector-java-5.0.8-bin.jar和module.xml 下面是文件 module.xml standalone.xml 这是

  • 问题内容: 谁能帮助解释为什么JNDI应该是公开数据库/ jms等服务的首选方式? 我遇到的所有帖子都谈到了不必加载特定的驱动程序管理器,从连接池中受益等优点,但是可以通过在属性文件中指定驱动程序管理器并使用反射来轻松实现。 连接池也可以通过将正确的实现方式通过spring或其他方式连接到应用Bean中来实现。 那么,为什么使用JNDI会更好呢? 问题答案: 当您必须在不同环境之间移动应用程序时,

  • 我想知道用JPA/Hibernate注册自定义SQL函数的最佳方法是什么。

  • 1. 前言 本节课将和大家一起讲解元数据概念,通过注解的方式实现 Hibernate 操作数据库。 这一切,会让工作变得更加简单、直接!!本节课程你将学习到: 什么是元数据; Hibernate 中有哪些注解; JPA 是什么。 2. 元数据 什么是元数据 先举一个生活中的例子:你买了一袋面粉,想用来揉几个包子,发几个馒头…… 可以把面粉当成原始数据,包子、馒头是你运用你的技能加工之后的成品数据。

  • 我们正在使用Hibernate生成销售报告。 脚本 当用户在输入一些条件后点击生成报告按钮时,我正在使用Hibernate状态从数据库中获取数据,然后我们正在进行一些数据操作以生成实际的报告数据。报告数据存储在ArrayList中,然后保存到与Hibernate实体映射的数据库中,如下图所示 CommusionSummary。JAVA 每个月都会生成报告。我的问题是:2012年7月5日,用户已经生

  • 目标: 通过访问多个持久性单元/数据源。 问题:在 Spring xml 配置中不流畅。注册多个数据源似乎需要多个 EntityManagerFactory,这会导致错误,指出 EntityManagerFactory 不是唯一的。我尝试了两个带有抽象父级的实体管理器工厂,因为我无法在实体管理器工厂定义中添加多个数据源而不是单个数据源。我该如何解决这个问题? 我不能使用SpringBoot或Jpa