Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
SpringTest
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Jira
Jira
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
測試專案
SpringTest
Commits
8b56bbc5
Commit
8b56bbc5
authored
Oct 08, 2018
by
楊慶堂
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
加上 synchronized 減少資料庫查詢次數
parent
cd5e8822
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
29 additions
and
34 deletions
+29
-34
src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java
...health/ym/springtest/hibernate/I18NReadEventListener.java
+29
-34
No files found.
src/main/java/org/ylhealth/ym/springtest/hibernate/I18NReadEventListener.java
View file @
8b56bbc5
...
...
@@ -22,6 +22,8 @@ import org.slf4j.LoggerFactory;
import
org.springframework.context.i18n.LocaleContextHolder
;
import
com.google.common.cache.Cache
;
import
com.google.common.cache.CacheBuilder
;
import
com.google.common.collect.Interner
;
import
com.google.common.collect.Interners
;
/** */
public
class
I18NReadEventListener
implements
PostLoadEventListener
{
...
...
@@ -32,6 +34,8 @@ public class I18NReadEventListener implements PostLoadEventListener {
private
SessionFactoryImplementor
sessionFactory
;
private
Interner
<
String
>
pool
=
Interners
.
newWeakInterner
();
@SuppressWarnings
(
"rawtypes"
)
private
Cache
<
String
,
Map
>
cache
=
CacheBuilder
.
newBuilder
().
expireAfterAccess
(
1
,
TimeUnit
.
MINUTES
).
build
();
...
...
@@ -80,7 +84,7 @@ public class I18NReadEventListener implements PostLoadEventListener {
* @throws InvocationTargetException
*/
private
Map
<
String
,
String
>
getTranslate
(
StatelessSession
session
,
I18NTranslates
i18n
,
Object
entity
,
Class
clazz
)
StatelessSession
session
,
I18NTranslates
i18n
,
Object
entity
,
@SuppressWarnings
(
"rawtypes"
)
Class
clazz
)
throws
IllegalAccessException
,
InvocationTargetException
{
Object
id
=
getPKValue
(
clazz
,
entity
);
String
language
=
LocaleContextHolder
.
getLocale
().
toString
();
...
...
@@ -93,6 +97,7 @@ public class I18NReadEventListener implements PostLoadEventListener {
return
translateTable
.
get
(
id
);
}
@SuppressWarnings
(
"unchecked"
)
private
Map
<
String
,
Map
<
String
,
String
>>
translateTable
(
StatelessSession
session
,
String
table
,
...
...
@@ -102,25 +107,33 @@ public class I18NReadEventListener implements PostLoadEventListener {
String
key
=
"Table:"
+
table
+
"_"
+
language
;
Map
<
String
,
Map
<
String
,
String
>>
result
=
cache
.
getIfPresent
(
key
);
if
(
result
==
null
)
{
logger
.
trace
(
"translate query, table: {}"
,
table
);
String
sql
=
String
.
format
(
"select * from %s where languageCode = ?"
,
table
);
SQLQuery
query1
=
session
.
createSQLQuery
(
sql
);
query1
.
setResultTransformer
(
Transformers
.
ALIAS_TO_ENTITY_MAP
);
query1
.
addScalar
(
idColumn
);
for
(
I18NTranslate
i18nTranslate
:
mapping
)
{
query1
.
addScalar
(
i18nTranslate
.
column
());
}
query1
.
setParameter
(
0
,
language
);
List
<
Map
<
String
,
String
>>
result1
=
query1
.
list
();
result
=
new
HashMap
<>();
for
(
Map
<
String
,
String
>
map
:
result1
)
{
result
.
put
(
map
.
get
(
idColumn
),
map
);
synchronized
(
pool
.
intern
(
key
))
{
result
=
cache
.
getIfPresent
(
key
);
if
(
result
==
null
)
{
logger
.
trace
(
"translate query, table: {}"
,
table
);
String
sql
=
String
.
format
(
"select * from %s where languageCode = ?"
,
table
);
SQLQuery
query1
=
session
.
createSQLQuery
(
sql
);
query1
.
setResultTransformer
(
Transformers
.
ALIAS_TO_ENTITY_MAP
);
query1
.
addScalar
(
idColumn
);
query1
.
addScalar
(
"languageCode"
);
for
(
I18NTranslate
i18nTranslate
:
mapping
)
{
query1
.
addScalar
(
i18nTranslate
.
column
());
}
query1
.
setParameter
(
0
,
language
);
List
<
Map
<
String
,
String
>>
result1
=
query1
.
list
();
result
=
new
HashMap
<>();
for
(
Map
<
String
,
String
>
map
:
result1
)
{
map
.
remove
(
"languageCode"
);
result
.
put
(
map
.
get
(
idColumn
),
map
);
}
cache
.
put
(
key
,
result
);
}
}
cache
.
put
(
key
,
result
);
}
return
result
;
}
private
Object
getPKValue
(
Class
<?>
clazz
,
Object
entity
)
throws
IllegalArgumentException
,
IllegalAccessException
,
InvocationTargetException
{
Collection
<
Field
>
fields
=
getAllDeclaredFields
(
clazz
);
...
...
@@ -132,29 +145,11 @@ public class I18NReadEventListener implements PostLoadEventListener {
}
for
(
Method
method
:
clazz
.
getDeclaredMethods
())
{
if
(
method
.
getAnnotation
(
Id
.
class
)
!=
null
)
{
return
method
.
invoke
(
entity
,
null
);
return
method
.
invoke
(
entity
);
}
}
return
null
;
}
/**
* Returns the entity's @{@link I18NTranslate} fields.
*
* <p>These fields are made accessible.
*/
private
static
Collection
<
Field
>
getLocalizedFields
(
Class
<?>
clazz
)
{
Collection
<
Field
>
fields
=
getAllDeclaredFields
(
clazz
);
List
<
Field
>
localizedFields
=
new
ArrayList
<>();
fields
.
stream
()
.
filter
(
field
->
field
.
getAnnotation
(
I18NTranslate
.
class
)
!=
null
)
.
forEach
(
field
->
{
field
.
setAccessible
(
true
);
localizedFields
.
add
(
field
);
});
return
localizedFields
;
}
private
static
Collection
<
Field
>
getAllDeclaredFields
(
Class
<?>
clazz
)
{
List
<
Field
>
fields
=
new
ArrayList
<>();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment