5

到目前为止,我们一直在使用 maven 依赖项来指定库,即:

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>3.6.10.Final</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-c3p0</artifactId>
  <version>3.6.10.Final</version>
  <type>jar</type>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>8.4-702.jdbc4</version>
</dependency>

但是,我们现在在不同的机器上运行完全相同的 .war 文件,并且希望保持相同的 One-war-file-to-rule-them-all,但不希望通过使用较旧的驱动程序来解决问题在 postgres 9.1 安装上(尤其是当字节数组编码默认值已更改时,例如)。Cliff-Claven 类似的信息可能无关紧要,但无论如何添加:这两种安装的操作系统都是 Mac OS X 服务器,Postgres 8.4 运行在 10.6 上,9.1 运行在 10.7 上。我们不需要升级任何数据(从头开始的单独实例)。

也许这比其他任何问题都更像是一个专家问题,但我似乎看不到任何特定于我的情况的东西。我确实找到了这个,但它是较旧的 Hibernate 3.5,不再适用。

4

3 回答 3

5

对于 PostgreSQL,无论服务器的版本如何,都应该使用最新版本的 JDBC 驱动程序,真正非常古老的版本除外。

http://jdbc.postgresql.org/download.html#current说:

这是驱动程序的当前版本。除非您有不寻常的要求(运行旧应用程序或 JVM),否则这是您应该使用的驱动程序。它支持 Postgresql 7.2 或更高版本,并且需要 1.4 或更高版本的 JVM。

对于 PostgreSQL JDBC 驱动程序,由于修复了错误并添加了功能,它们通常只进入最新版本。较新的 JDBC 驱动程序版本可以识别较旧的服务器版本,并将根据服务器版本正确运行。

请注意,较旧的 JDBC 驱动程序知道较新的服务器版本,事实上,使用比服务器版本旧的 JDBC 驱动程序可能会导致安全问题。

于 2012-04-17T15:00:50.477 回答
3

不确定我是否理解你的问题。我对这个问题的看法略有不同。以下是我的意见/建议:

  1. 不要将与驱动程序相关的 jar 直接捆绑到 war 文件中,而是使用由应用程序服务器(tomcat 等)管理的数据源
  2. 这样就不会对驱动程序类产生任何依赖关系。
  3. 数据源配置可以在应用程序服务器上完成,您的 Web 应用程序只需要知道其 JNDI 名称即可进行查找。
  4. 这也将与您的One-war-file-to-rule-them-all方法保持一致,因为 war 文件将真正独立于任何与驱动程序相关的依赖项。

这种方法的缺点是驱动程序 jar 需要在应用服务器上手动维护,但它只是一次任务,并且与任何应用程序级别的更改完全分离。

于 2012-04-17T14:06:19.247 回答
1

最好的解决方案可能是将 jdbc 驱动程序放入服务器上的共享 lib 文件夹中,而不是将其打包到 war 中。这可以通过将范围设置为 来完成provided

您可以在 pom 中使用不同的依赖版本定义构建配置文件,但这需要两次调用构建并导致两个不同的 war 文件。

于 2012-04-17T13:05:29.360 回答