質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

13094閲覧

SpringBoot OracleとPostgresに接続したい

plue

総合スコア71

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

2クリップ

投稿2015/03/03 12:46

検索するテーブルによって、OracleとPostgresを切り替えたいのですが、方法が分からず困っています。
現在、以下のような設定をしていますが、postgresのテーブル参照時に
Oracleに接続しに行ってしまい、結果、エラーが発生する状況です。

application.properties

lang

1#DB(postgre) 2spring.database.driverClassName=org.postgresql.Driver 3spring.datasource.url=jdbc:postgresql://localhost:5432/aaa 4spring.datasource.username=aaa 5spring.datasource.password=aaa 6 7#DB(oracle) 8spring.database.driverClassName=oracle.jdbc.driver.OracleDriver 9spring.datasource.url=jdbc:oracle:thin:@aaa:1521/aa 10spring.datasource.username=aaa 11spring.datasource.password=aaa

pom.xml

lang

1 <!-- postgres --> 2 <dependency> 3 <groupId>org.postgresql</groupId> 4 <artifactId>postgresql</artifactId> 5 <version>9.3-1101-jdbc3</version> 6 </dependency> 7 <!-- oracle --> 8 <dependency> 9 <groupId>com.oracle</groupId> 10 <artifactId>ojdbc6</artifactId> 11 <version>11.2.0</version> 12 </dependency>

エラーログ

lang

1java.sql.SQLSyntaxErrorException: ORA-01747: user.table.column、table.columnまたは列指定が無効です 2 3 at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91) 4 at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) 5 at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206) 6 at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455) 7 at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413) 8 at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1034) 9 at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194) 10 at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:791) 11 at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:866) 12 at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186) 13 at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3387) 14 at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3431) 15 at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491) 16 at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:82)

お分かりになる方がいらっしゃいましたら、ご教授よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以下のサイトを参考に、できるようになりました。
http://m-namiki.hatenablog.jp/entries/2011/11/24

application.properties (使いません)

lang

1#DB(postgre) 2#spring.database.driverClassName=org.postgresql.Driver 3#spring.datasource.url=jdbc:postgresql://localhost:5432/aaa 4#spring.datasource.username=aaa 5#spring.datasource.password=aaa 6 7#DB(oracle) 8#spring.database.driverClassName=oracle.jdbc.driver.OracleDriver 9#spring.datasource.url=jdbc:oracle:thin:@aaa:1521/aa 10#spring.datasource.username=aaa 11#spring.datasource.password=aaa

pom.xml (変更なし)

以下のクラスを新たに定義

lang

1/*****************/ 2/** 接続先の定義 */ 3/*****************/ 4public enum SchemaType { 5 /** Oracle接続用のデータソースキー */ 6 ORACLE, 7 /** PostgreSql接続用のデータソースキー */ 8 POSTGRES 9} 10 11/***************************/ 12/** 接続先を保持するクラス */ 13/***************************/ 14public class SchemaContextHolder { 15 private static ThreadLocal<SchemaType> contextHolder = new ThreadLocal<SchemaType>(); 16 /** 17 * スレッドローカルに対象スキーマを設定します。 18 * 19 * @param type 20 * 対象スキーマの種類 21 */ 22 public static void setSchemaType(SchemaType type) { 23 contextHolder.set(type); 24 } 25 /** 26 * 対象スキーマを返却します。 27 * 28 * @return 対象スキーマ 29 */ 30 public static SchemaType getSchemaType() { 31 return contextHolder.get(); 32 } 33 /** 34 * スレッドローカルを空にします。 35 */ 36 public static void clear() { 37 contextHolder.remove(); 38 } 39} 40 41/**********************************/ 42/** データソースを返却するクラス */ 43/**********************************/ 44import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; 45 46public class DynamicRoutingDataSourceResolver extends AbstractRoutingDataSource { 47 48 @Override 49 protected Object determineCurrentLookupKey() { 50 51 if (SchemaContextHolder.getSchemaType() == null) { 52 } else if(SchemaContextHolder.getSchemaType() == SchemaType.POSTGRES) { 53 return "dataSource1"; 54 } else if(SchemaContextHolder.getSchemaType() == SchemaType.ORACLE) { 55 return "dataSource2"; 56 } 57 return "dataSource1"; 58 } 59} 60 61/*********************************/ 62/** データソースを定義したクラス */ 63/*********************************/ 64import java.util.HashMap; 65import java.util.Map; 66import javax.sql.DataSource; 67import org.springframework.context.annotation.Bean; 68import org.springframework.context.annotation.Configuration; 69 70@Configuration 71public class DatasourceConfig { 72 73 @Bean() 74 public DataSource dataSource1() { 75 org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(); 76 ds.setDriverClassName("org.postgresql.Driver"); 77 ds.setUrl("jdbc:postgresql://posgredb:5432/aaa"); 78 ds.setUsername("posgreuser"); 79 ds.setPassword("posgrepass"); 80 return ds; 81 } 82 83 @Bean() 84 public DataSource dataSource2() { 85 org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(); 86 ds.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 87 ds.setUrl("jdbc:oracle:thin:@oradb:1521/aaa"); 88 ds.setUsername("orauser"); 89 ds.setPassword("orapass"); 90 return ds; 91 } 92 93 @Bean() 94 public DynamicRoutingDataSourceResolver dataSource() { 95 DynamicRoutingDataSourceResolver resolver = new DynamicRoutingDataSourceResolver(); 96 97 Map<Object, Object> dataSources = new HashMap<Object,Object>(); 98 dataSources.put("dataSource1", dataSource1()); 99 dataSources.put("dataSource2", dataSource2()); 100 101 resolver.setTargetDataSources(dataSources); 102 103 return resolver; 104 } 105}

使い方

lang

1/*****************/ 2/** メインクラス */ 3/*****************/ 4import org.springframework.boot.SpringApplication; 5import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 6import org.springframework.context.annotation.ComponentScan; 7import org.springframework.context.annotation.Configuration; 8import org.springframework.context.annotation.Jsr330ScopeMetadataResolver; 9 10@Configuration 11// TODO データソース動的切替え(scopeResolver = Jsr330ScopeMetadataResolver.class) 12@ComponentScan(scopeResolver = Jsr330ScopeMetadataResolver.class) 13@EnableAutoConfiguration 14public class MyApplication { 15 public static void main(String[] args) { 16 SpringApplication.run(M3SApplication.class, args); 17 } 18} 19/***********************/ 20/** コントローラクラス */ 21/***********************/ 22import java.util.List; 23import org.springframework.beans.factory.annotation.Autowired; 24import org.springframework.stereotype.Controller; 25import org.springframework.web.bind.annotation.RequestMapping; 26import org.springframework.web.bind.annotation.RequestMethod; 27import org.springframework.web.servlet.ModelAndView; 28 29@Controller 30public class TopController { 31 32 /** Topサービス */ 33 @Autowired 34 TopService topService; 35 36 @RequestMapping(value="/getOracle", method={RequestMethod.POST, RequestMethod.GET}) 37 public ModelAndView getOracle(){ 38 39 // 接続先データソースにOracleを指定 40 SchemaContextHolder.setSchemaType(SchemaType.ORACLE); 41 // Oracleからデータ取得 42 List<Object[]> list = topService.getOracleData(); 43 44 // 遷移先画面の設定 45 ModelAndView mv = new ModelAndView("oraclePage"); 46 // 画面パラメータ設定 47 mv.addObject("oracleData",list); 48 49 return mv; 50 } 51 52 @RequestMapping(value="/getPostgres", method={RequestMethod.POST, RequestMethod.GET}) 53 public ModelAndView getPostgres(){ 54 55 // 接続先データソースにPostgresを指定 56 SchemaContextHolder.setSchemaType(SchemaType.POSTGRES); 57 // POSTGRESからデータ取得 58 List<Object[]> list = topService.getPostgresData(); 59 60 // 遷移先画面の設定 61 ModelAndView mv = new ModelAndView("PostgresPage"); 62 // 画面パラメータ設定 63 mv.addObject("postgresData",list); 64 65 return mv; 66 } 67} 68/*******************/ 69/** サービスクラス */ 70/*******************/ 71@Service 72@Transactional 73public class TopService { 74 /** Oracleデータ取得用リポジトリ */ 75 @Autowired 76 IOracleRepository oracle_repository; 77 78 /** Postgresデータ取得用リポジトリ */ 79 @Autowired 80 IPostgresRepository postgres_repository; 81 82 // Oracleデータ取得実行 83 public List<Object[]> getOracleData(){ 84 return oracle_repository.findAll(); 85 } 86 // Postgresデータ取得実行 87 public List<Object[]> getPostgresData(){ 88 return postgres_repository.findByYMD("20141222","20141228"); 89 } 90}

投稿2015/03/04 01:53

plue

総合スコア71

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問