OSGI 容器中的数据源

Posted

技术标签:

【中文标题】OSGI 容器中的数据源【英文标题】:DataSource in an OSGI container 【发布时间】:2017-05-04 09:10:14 【问题描述】:

我有一个简单的 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

【问题讨论】:

呃……春天?? 是的呢? 【参考方案1】:

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

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

【讨论】:

谢谢您的回复,我正在尝试使用第二种解决方案,我成功创建了DataSource(服务:list javax.sql.DataSource 显示它),我不退出获取的是如何从应用上下文访问它? 你需要参考OSGi服务。您可以使用 spring-dm(不幸的是未维护)或完全切换到蓝图来做到这一点。 哦,是吗?这很奇怪,因为我刚刚在 spring 配置文件中使用了 并且它似乎工作,即 entitymanager 不为空,我错过了什么吗? 不确定...您可以将您的弹簧配置粘贴到某处吗?顺便说一句,您如何加载弹簧配置? spring config : pastebin.com/4vDS9MsQ persistence.xml : pastebin.com/4AC60E70 然后我在 karaf 中部署一个配置文件,其中包含 url、密码 ...

以上是关于OSGI 容器中的数据源的主要内容,如果未能解决你的问题,请参考以下文章

OSGI容器中的Scala?

OSGi 容器 - Equinox 与 Apache Karaf 中的 Apache Felix

无法从 Karaf 2.2.0 OSGi 容器中的根上下文运行 WAR

为啥即使我的 maven 依赖项中有第三方依赖项,也只需要 OSGi 容器中的第三方依赖项?

osgi+camel+karaf运行环境搭建

使用 pax web 在 OSGI 容器中部署 Web 应用程序时出错