我現在已經在數據庫2個表:AbstractRoutingDataSource變化圖在運行時
- 用戶
- user_database
在用戶I存儲登錄名,密碼,角色
在user_database我存儲數據庫驅動程序,網址,密碼和用戶。 圖數據庫
我想用戶登錄到我的頁面和下一個連接,他所做的將被髮送到用戶數據庫。爲什麼我需要什麼?我計劃地圖流行的電子商務,並創建Android應用程序,用戶登錄並查看商店數據,可以添加和查看產品訂單。
現在是時候去練習了,我在彈簧技術方面的知識很少,請在我做錯事情時向我解釋一些事情。 AbstractRoutingDataSource
的所有示例都在持久性文件中聲明瞭數據源或創建了數據源bean,並使用AbstractRoutingDataSource
開始。 在我的項目中,我現在不用用戶連接,我需要從數據庫中獲取此信息。我試着得到使用知識庫和這個例子 https://stackoverflow.com/a/17575648/3037869 但我在控制器@Autowired
null,我認爲庫的連接爲null。如何設置此存儲庫的連接並設置Route?缺陷是當我添加用戶時,我需要重新啓動服務器來刷新連接。
接下來嘗試我現在使用的是類User
實施UserDetails
用戶登錄後,我可以從getPrincipal()
獲得用戶連接並添加到地圖。
private void setDataSources() {
HashMap<Object, Object> targetDataSources = new HashMap<>();
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url("jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
dataSourceBuilder.username("sa");
dataSourceBuilder.password("");
targetDataSources.put("auth", dataSourceBuilder.build());
setDefaultTargetDataSource(dataSourceBuilder.build());
if(SecurityContextHolder.getContext().getAuthentication()!=null) {
User user=(User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
System.out.println(user.getUserDatabase().getDriver());
dataSourceBuilder.driverClassName(user.getUserDatabase().getDriver());
dataSourceBuilder.url(user.getUserDatabase().getUrl());
dataSourceBuilder.username("3450_Menadzer");
dataSourceBuilder.password(user.getUserDatabase().getPassword());
targetDataSources.put("user", dataSourceBuilder.build());
}
setTargetDataSources(targetDataSources);
afterPropertiesSet(); //map is refresh when i add this
}
我運行constuctor這種方法determineCurrentLookupKey
protected Object determineCurrentLookupKey() {
if(SecurityContextHolder.getContext().getAuthentication()!=null) {
setDataSources();
return "user";
}
return "auth";
}
這是工作,但是當我刷新3-4次的用戶數據庫中請求我讓
User 3450_Menadzer already has more than 'max_user_connections' active connections
設置連接地圖manualy而不是刷新每個方法determineCurrentLookupKey
運行我沒有這個問題。我認爲我的方法不是混淆連接。我如何清理這個?這可能更好的方法來路由連接?
編輯 @SergeBallesta我改變了一些代碼,從你的例子 這是我在地圖
@Component
@Scope(value = "singleton")
public class DataSourceMap {
private Map<Object,Object> dataSourceMap;
public DataSourceMap()
{
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.driverClassName("org.h2.Driver");
dataSourceBuilder.url("jdbc:h2:mem:AZ;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
dataSourceBuilder.username("sa");
dataSourceBuilder.password("");
dataSourceMap=new HashMap<Object,Object>();
dataSourceMap.put("auth",dataSourceBuilder.build());
}
public void addDataSource(String session,DataSource dataSource)
{
this.dataSourceMap.put(session,dataSource);
}
public Map<Object,Object> getDataSourceMap()
{
return dataSourceMap;
}
public void removeSource(String session)
{
dataSourceMap.remove(session);
}
}
類AbstractRoutingDataSource
我做了一些改變,我是加afterPropertiesSet()
怎麼一回事,因爲數據源不刷新。我做了一些刷新,我沒有得到錯誤,我認爲這是工作。我需要測試這個更多的數據庫在未來
@Component
public class CustomRoutingDataSource extends AbstractRoutingDataSource{
@Autowired
DataSourceMap dataSources;
@Override
protected Object determineCurrentLookupKey() {
setDataSources(dataSources);
afterPropertiesSet();
System.out.println("test");
if(SecurityContextHolder.getContext().getAuthentication()!=null) {
HttpServletRequest request = ((ServletRequestAttributes)
RequestContextHolder.getRequestAttributes()).getRequest();
return request.getSession().getId();
}
return "auth";
}
@Autowired
public void setDataSources(DataSourceMap dataSources) {
System.out.println("data adding");
setTargetDataSources(dataSources.getDataSourceMap());
}
}
你能分享你的代碼嗎?我在用戶登錄後擁有相同的任務,連接到一個基本數據庫並獲取數據源,然後將CRUD添加到數據源中!但我在Spring Framework中很新,我試了一個月,但沒有好的結果。我希望你的代碼能幫助我。 – mikezang