我对Spring框架还很陌生,并且在设置我当前正在研究的项目时遇到了一些麻烦。我需要能够连接到两个不同的数据库,一个是MongoDB,另一个是MSSQL。我正在使用JPA连接到MSSQL。
我遇到的问题是,当我希望它对MSSQL进行调用时,它似乎正在尝试对Mongo数据库进行调用,而我不确定如何告诉它要读取的内容。我看到过这些帖子建议使用@Qualifier
注释将其定向到正确的实现,但是我认为这对我的情况不起作用。
@RestController
@RequestMapping("/software")
public class SoftwareEndpoint {
@Autowired
SoftwareRepository repo;
/**********************************************************************************
********************************MSSQL calls****************************************
***********************************************************************************/
@RequestMapping(value="/all",method=RequestMethod.GET,produces=MediaType.APPLICATION_JSON)
String getAllSoftware(){
System.out.println("Here1");
List<Software> allSoftware = (List<Software>) repo.findAll();
System.out.println("Here2");
//rest of method and class
上面显示了我的控制器类的代码片段,其中包含我的SoftwareRepository的一个实例。在db调用之前和之后,我还打印到out流。
输出流仅显示“ Here1”,然后继续打印以下行:
2016-10-04 07:35:39.810 INFO 4236 --- [nio-8080-exec-2] org.mongodb.driver.cluster : No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, all=[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoSocketOpenException: Exception opening socket}, caused by {java.net.ConnectException: Connection refused: connect}}]}. Waiting for 30000 ms before timing out
然后在超时时引发异常。
我没有在本地运行的mongo实例,但是会在其中部署应用程序,但是我不认为这是问题所在,因为在到达该端点时,它不应该调用Mongo数据库,应该尝试与MSSQL进行联系。
TLDR:如何指定用于特定存储库或数据库调用的Spring数据库实现?
您可以根据上下文中的配置在Spring中连接到不同的数据库。
以下代码用于连接到MySql和Mongo
DB。如果您拥有JDBC,则可以用MSSQL代替MySql。检查http://jdbforms.sourceforge.net/UsersGuide/html/ch20s02.html,了解JDBC连接的属性的含义。
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="mySqldataSource" /> <!-- Change the datasource to MSSQL-->
</bean>
<bean id="mySqldataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="removeAbandoned">
<value>true</value>
</property>
<property name="removeAbandonedTimeout">
<value>30</value>
</property>
<property name="driverClassName">
<value>MSSQL_DRIVER_CLASS_NAME</value>
</property>
<property name="url">
<value>MSSQL_DATABASE_URL</value>
</property>
<property name="username">
<value>MSSQL_DB_USER_NAME</value>
</property>
<property name="password">
<value>MSSQL_DB_PASSWORD</value>
</property>
<property name="maxIdle">
<value>10</value>
</property>
<property name="maxActive">
<value>10</value>
</property>
<property name="maxWait">
<value>100000</value>
</property>
<property name="testOnBorrow">
<value>false</value>
</property>
<property name="testWhileIdle">
<value>false</value>
</property>
<property name="timeBetweenEvictionRunsMillis">
<value>60000</value>
</property>
<property name="minEvictableIdleTimeMillis">
<value>60000</value>
</property>
<property name="numTestsPerEvictionRun">
<value>1</value>
</property>
<property name="defaultTransactionIsolation" value="1" />
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="1" />
</bean>
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"></bean>
下面是用于连接mongodb
<mongo:db-factory dbname="mongoDbName" host="mongoServer" port="mongoPort"/>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
</bean>
<mongo:repositories base-package="com.test.repoPackage"/> <!-- Package containing the mongo repository interfaces -->
现在,您可以使用spring提供的存储库。
编辑1: 假设config的名称是springConfig.properties。在上面的示例中,针对mongo:db-
factory中的属性dbname,host和port,您需要在springConfig.properties中配置这些值。因此,让他们在下面命名:
mongoServer = xxx.xx.xxx.xxx
mongoPort = 27017
mongoDb = testDb
现在,需要修改上下文文件以导入springConfig.properties。这是在上下文文件中按以下方式完成的:
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
<property name="locations" >
<list>
<value>classpath:/log4j.properties</value>
<value>classpath:/springConfig.properties</value>
</list>
</property>
</bean>
豆mongo:db-factory现在看起来像:
<mongo:db-factory dbname="${mongoDb}" host="${mongoServer}" port="${mongoPort}"/>
请注意,配置中的“键”(dbname,主机和端口)用insde $ {}表示。这将替换为config中的键值。
现在,当我启动Spring Data JPA时,我的印象是Spring Data JPA是JPA规范的独立实现。原来我错了。 如果我理解正确的话,Spring Data JPA是Spring提供的一个抽象层,它在内部使用其他JPA提供者(例如Hibernate),所以通常如下所示:
我正在使用YouTube数据应用编程接口(Python客户端库)将视频上传到YouTube。是否可以从应用编程接口为该视频设置变现,而不是进入我在YouTube网站上的帐户并手动为上传的视频设置变现?如果是,那么我如何从应用编程接口做到这一点?我无法在应用编程接口留档中找到它,谷歌搜索也没有帮助。
为什么测试用例需要@Transactional,其功能将在dao层中进行更新(JPA存储库),比如 当测试在没有@Transaction注释的情况下运行时,它会在行中给出以下异常 组织。springframework。刀。InvalidDataAccessApiUsageException:执行更新/删除查询;嵌套的异常是javax。坚持不懈TransactionRequiredException
问题内容: 我正在使用Spring + Hibernate+JPA,但遇到无法将实体持久保存到数据库的情况。我已经建立了一个带有@Transactional注释的服务类。它使用包含注入的EntityManager的DAO。当我在服务对象上调用函数时,我看到DAO正在进行大量的选择读取,但是由于我的DAO发出的合并和删除操作,没有更新/删除。当然,我的设置有问题,但是我看不到它。 persisten
} 如果我向登录进程“/user/login”发送请求,System.out.println的值(“a.isauthenticated:”+a.isauthenticated());是“true” 然后我又回到了AccessToken, 并且我为令牌身份验证设置了一个过滤器类和HttpSessionStrategy bean ,