Java 最佳实践?JNDI、Hibernate和Tomcat

Java 最佳实践?JNDI、Hibernate和Tomcat,java,hibernate,tomcat,jndi,Java,Hibernate,Tomcat,Jndi,我有一个web应用程序,由tomcat托管,它使用hibernate与数据库通信 我正在研究如何在从开发人员迁移到测试和产品时减轻配置带来的痛苦 我看到JNDI提到了很多,乍一看这似乎是个好主意。在每个tomcat实例上配置一个jndi资源,web上下文只使用它 然而,在进一步研究之后,为了有一个JNDI,我必须在tomcat lib文件中有我的所有数据库对象+hibernate,这样才能工作。这听起来很吓人,如果我想部署另一个使用不同版本hibernate的上下文呢 此外,我不仅仅是在用维护配

我有一个web应用程序,由tomcat托管,它使用hibernate与数据库通信

我正在研究如何在从开发人员迁移到测试和产品时减轻配置带来的痛苦

我看到JNDI提到了很多,乍一看这似乎是个好主意。在每个tomcat实例上配置一个jndi资源,web上下文只使用它

然而,在进一步研究之后,为了有一个JNDI,我必须在tomcat lib文件中有我的所有数据库对象+hibernate,这样才能工作。这听起来很吓人,如果我想部署另一个使用不同版本hibernate的上下文呢

此外,我不仅仅是在用维护配置的痛苦来换取由于安装的jndi资源类和我上下文中的资源类之间的不匹配而导致的中断的痛苦

理想情况下,我想我想要的是用tomcat说出来。有一个名为X的数据库,它位于此服务器上,具有此用户/通行证

如果您能想到在不同的环境中处理不同配置需求的最佳方法,我将不胜感激,因为在每次部署之后都不需要额外的步骤来更新配置文件

干杯,
彼得

我相信你把事情弄糊涂了

JNDI只是分配给数据源池的名称。此数据源使用JDBC驱动程序,该驱动程序位于全局Tomcat类路径中,但它是整个设置中唯一的共享资源

Datasource定义了连接URL、用户名、密码和连接选项,每个服务器的连接选项可能有所不同,但应用程序并不关心它——它只知道JNDI名称,例如“jdbc/myDatasource”

所有hibernate罐,以及任何其他罐和其他罐都将在战争中打包。它们只在WAR中“可见”,因此您可以将多个应用程序使用冲突版本的库部署到同一个Tomcat


不需要污染Tomcat的lib/目录。正如您正确观察到的那样,这是一种不好的做法。

所以这里的说明()是一个不好的主意?另外,假设我可以解决如何创建会话工厂,作为与jndi数据源对话的东西,如何处理使用mysql的开发环境和使用SQLServer的测试/生产问题?其中的说明是如何通过JNDI使用SessionFactory。换句话说,如何在几个应用程序之间共享Hib SF。我看不出“它是多么有用”,所以我的建议是只共享必要的最小值,即datasource。您使用的不是不同的版本,而是dev和prod中的RDBMS?好。。。这真是一次冒险,嗯?不过,您可以做的是将hibernate.cfg.xml放入Tomcat全局类路径中。其余的文件仍在战争中。嗯,现在有个主意。可能会脱离默认名称,将其命名为mycontext-hibernate.cfg.xml。我会向你汇报,告诉你我的进展。