java - OSGI 容器中的数据源

标签 java spring postgresql hibernate osgi

我有一个简单的 Spring 应用程序,它通过 EntityManager 连接到数据库

所以我必须进行以下配置:

<bean id="domainEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="TheManager" />
    <property name="dataSource" ref="domainDataSource" />
    <property name="packagesToScan" value="com.conztanz.persistence.stock.model" />

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
</bean>


<bean id="domainDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver" />
    <property name="url" value="jdbc:postgresql://localhost:5433/dbName" />
    <property name="username" value="xxxx" />
    <property name="password" value="xxxx" />
</bean>

这在通过 main 类(手动加载 AppContext)午餐时工作正常

但是,一旦部署到 ServiceMix 中,我就会收到以下错误:

Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [org.postgresql.Driver]
  • 我在某处读到 OSGIDriverManager 不能很好地混合,但我不明白为什么。
  • 似乎是一个好的做法的解决方案是将 dataSource 作为 OSGI 包公开,您同意吗?在这种情况下,您如何从 spring context 访问它以便能够拥有一个 EntityManager

最佳答案

DriverManager 在 OSGi 中不能正常工作。最简单的方法是直接使用数据源。大多数数据库驱动程序都有这样一个类。如果您在您的应用程序上下文中实例化它,那么它将起作用。缺点是它会将您的应用程序绑定(bind)到 DB 驱动程序,因为它将导入 DataSource impl 的包。

一种更松散耦合的方法是使用 ops4j pax jdbc .它允许从配置管理中的配置创建一个数据源作为 OSGi 服务。因此,在您的应用上下文中,您只需添加对 DataSource 服务的依赖。所以你的应用程序没有绑定(bind)到特定的数据库驱动程序。一个典型的用例是在测试中使用 H2,在生产中使用 oracle。

关于java - OSGI 容器中的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41220511/

相关文章:

postgresql - PostgreSQL 中的聚簇索引和非聚簇索引

sql - 需要对某个日期期间的行进行计数,然后根据该日期期间使用其他条件的情况对行进行计数

java - 制作一个方法将不同的方法分别放在一个for循环中?

java - play framework migrate to 2.1.1让我很头疼

java - <tx :annotation-driven/> leads to java. lang.ClassNotFoundException : org. aopalliance.aop.Advice

Spring queryByExample 与范围之间

Java Spring 框架错误

php - 从 cakephp 中的输入中删除多余的空格

java - JClouds-Chef 有恢复功能吗?

java - 由于主方法/java 类文件异常错误,我的程序无法运行