繁体   English   中英

OSGI容器中的数据源

[英]DataSource in an OSGI container

我有一个简单的Spring App,它通过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中无法正常运行。 最简单的方法是直接使用数据源。 大多数数据库驱动程序都具有此类。 如果您在应用程序上下文中实例化它,那么它将起作用。 缺点是,它将应用程序绑定到DB驱动程序,因为它将随后为DataSource impl导入软件包。

一种更宽松的耦合方式是使用ops4j pax jdbc 它允许从config admin中的配置创建一个数据源作为OSGi服务。 因此,在您的应用程序上下文中,您只需要向DataSource服务添加依赖项。 因此,您的应用程序未绑定到特定的数据库驱动程序。 一种典型的用例是在测试中使用H2,在生产中使用oracle。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM