243 lines
31 KiB
HTML
243 lines
31 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en-us">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<title>Redkale(红菜苔)--基于Java 8全新的微服务开源框架 - Redkale官网</title>
|
||
<meta name="keywords" content="Redkale,redkale,java,微服务,架构"/>
|
||
<meta name="description" content="Redkale(红菜苔)是基于Java 8全新的微服务开源框架"/>
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<link rel="stylesheet" type="text/css" href="stylesheets/stylesheet.css" media="screen">
|
||
</head>
|
||
<body>
|
||
<section class="page-header">
|
||
<a href="index.html" class="project-name">Redkale</a>
|
||
<h2 class="project-tagline"></h2>
|
||
<a href="redkale.html" class="btn">Redkale 入门</a>
|
||
<a href="convert.html" class="btn">Convert 组件</a>
|
||
<a href="service.html" class="btn">Service 组件</a>
|
||
<a href="source.html" class="btn">Source 组件</a>
|
||
<a href="net.html" class="btn">Net 组件</a>
|
||
<a href="watch.html" class="btn">Watch 组件</a>
|
||
<a href="articles.html" class="btn">技术文章</a>
|
||
<a href="code.html" class="btn">Java 源码</a>
|
||
</section>
|
||
|
||
<section class="main-content">
|
||
<h3><a id="source_intro" class="anchor" href="#" aria-hidden="true"></a>Source 组件介绍</h3>
|
||
|
||
<p> Source 主要为数据源提供简易的操作接口,使底层的具体数据源(传统数据库、文件系统、内存数据库、Memcached/Redis缓存)对上层是透明的。其提供两种类型的数据源:DataSource 和 CacheSource。DataSource 为数据库或内存数据库,提供类似JPA、Hibernate的接口与功能。CacheSource 为缓存数据提供类似Memcached、Redis的接口和功能。两者也提供了异步接口(基于<a href="service.html#service_remote" target="_blank">远程模式Service</a>)。<br/></p>
|
||
|
||
<h3><a id="source_datasource" class="anchor" href="#" aria-hidden="true"></a>DataSource 入门</h3>
|
||
<p>
|
||
JPA虽已提供了简洁成熟的数据库操作接口,但当数据、业务量很庞大的时候就显得捉襟见肘,与JPA相比,DataSource有以下几个特点:<br/>
|
||
1、简易的过滤查询接口,但仅支持简单的表关联查询。 <br/>
|
||
2、分布式的主键的分布式自增策略。 <br/>
|
||
3、动态更新变更后的数据库连接参数。 <br/>
|
||
4、读写分离的简易配置。 <br/>
|
||
5、进程间的缓存自动同步。 <br/>
|
||
数据库操作方面常见的是过滤查询操作,JPA规范中的JPQL虽然简化了SQL,但是对于动态产生的过滤条件,使用者还是无法免去组装过滤条件的过程(无论JPQL还是CriteriaQuery), DataSource定义了FilterBean接口可以省略组装条件的过程,FilterNode提供了类似CriteriaQuery的功能,且这两种对象都可以序列化,给<a href="service.html#service_remote" target="_blank">远程模式Service</a>提供了基础,微服务架构提倡服务之间尽量降低耦合,因此DataSource仅支持简单的关联查询,复杂的表关联查询或统计应放在数据分析系统中。一个服务通常部署多个进程,若用JPA的缓存则进程之间的缓存无法同步,而DataSource采用SNCP协议即可方便地达到自动同步缓存功能。JPA无法在主数据库异常时动态切换到备份数据库,DataSource会监听<a href="#source_confxml">persistence.xml</a>文件,当文件配置发生变化时自动切换新的数据库配置。<br/>
|
||
为了降低学习成本,DataSource重用了JPA里的部分注解与配置文件,使用方法基本相同,与JPA用法的区别是注解只能标记于字段,不能标记在方法上。
|
||
</p>
|
||
<table style="margin: auto;">
|
||
<tr><th>注解类名</th><th>功能描述</th></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.Cacheable</td><td>标记Entity类是否需要缓存,与JPA用法一致</td></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.Column</td><td>标记字段,只使用其name()、insertable()、updatable()属性</td></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.Entity</td><td>JPA的Entity类必须标记为@Entity, 而Redkale不强制要求,所以该注解一般无用</td></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.GeneratedValue</td><td>仅用于标记主键是否为数据库自增长,其内值的两属性废弃</td></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.GenerationType</td><td>被@GeneratedValue的属性引用,在Redkale内不被使用到</td></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.Id<td>标记主键字段,与JPA用法一致</td></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.Table<td>标记表的别名,与JPA用法一致</td></tr>
|
||
<tr><td style="text-align: left;">javax.persistence.Transient<td>标记是否为表对应的字段,与JPA用法一致</td></tr>
|
||
<tr><td style="text-align: center;font-size: 0.9rem;" colspan="2"><b>以下是Redkale自定义的注解</b></td></tr>
|
||
<tr><td style="text-align: left;"><b>@VirtualEntity</b></td><td>用于非数据库表对应的Entity类,且仅用于开启缓存模式的DataSource</td></tr>
|
||
<tr><td style="text-align: left;"><b>@DistributeGenerator</b></td><td>标记主键是否采用分布式自增长策略,不能与@GeneratedValue同用</td></tr>
|
||
<tr><td style="text-align: left;"><b>@DistributeTables</b></td><td>当多个表的主键唯一性公用时需要该注解</td></tr>
|
||
<tr><td style="text-align: left;"><b>@FilterColumn</b></td><td>用于FilterBean过滤类的字段设置</td></tr>
|
||
<tr><td style="text-align: left;"><b>@FilterJoinColumn</b></td><td>用于FilterBean过滤类的关联表字段设置</td></tr>
|
||
<tr><td style="text-align: left;"><b>@FilterGroup</b></td><td>用于FilterBean过滤类的过滤条件分组设置</td></tr>
|
||
</table>
|
||
<p>
|
||
操作数据源主要使用的对象有 DataSource、FilterBean、FilterNode。DataSource 提供的接口分几种系列:
|
||
</p>
|
||
|
||
<table style="margin: auto;">
|
||
<tr><th>系列方法</th><th>功能描述</th></tr>
|
||
<tr><td style="text-align: left;">insert</td><td>插入数据</td></tr>
|
||
<tr><td style="text-align: left;">delete</td><td>删除数据</td></tr>
|
||
<tr><td style="text-align: left;">update</td><td>更新数据</td></tr>
|
||
<tr><td style="text-align: left;">updateColumnXXX</td><td>更新数据的部分字段</td></tr>
|
||
<tr><td style="text-align: left;">getNumberResult</td><td>统计查询,用于查询字段的总和、最大值、平均值等数据</td></tr>
|
||
<tr><td style="text-align: left;">queryColumnXXX<td>单个字段数据查询和字段的统计查询</td></tr>
|
||
<tr><td style="text-align: left;">find<td>查找单个对象</td></tr>
|
||
<tr><td style="text-align: left;">queryList<td>查询对象的List集合</td></tr>
|
||
<tr><td style="text-align: left;">querySheet</td><td>查询对象的Sheet页式集合</td></tr>
|
||
<tr><td style="text-align: left;">directXXX<td>直接运行SQL语句,用于复杂的关联查询与更新</td></tr>
|
||
</table>
|
||
<p>
|
||
以上接口除了directXXX,其他都有等同的异步接口。insert、delete、update接口与JPA同名接口用法一样。DataSource提供了丰富的查询接口,且有独特的翻页查询功能。每以系列的方法主要重载三类: 单个字段过滤、FilterBean过滤和FilterNode过滤。
|
||
</p>
|
||
<p> <b>过滤条件</b></p>
|
||
<p> FilterBean、FilterNode对象用于构造过滤条件。FilterBean可以转化为FilterNode。FilterBean主要用于接收外界构建的过滤条件,而FilterNode为了构建内部的过滤条件且降低过滤条件变化的耦合性。</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserBean</span> <span class="kd">implements</span> <span class="n">FilterBean</span> <span class="o">{</span>
|
||
|
||
<span class="kd">private</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">;</span>
|
||
|
||
<span class="nd">@FilterColumn</span><span class="o">(</span><span class="n">express</span> <span class="o">=</span> <span class="n">FilterExpress</span><span class="o">.</span><span class="na">LIKE</span><span class="o">)</span>
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">username</span><span class="o">;</span>
|
||
|
||
<span class="kd">private</span> <span class="n">Range</span> <span class="n">age</span><span class="o">;</span>
|
||
|
||
<span class="kd">public</span> <span class="nf">UserBean</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">,</span> <span class="n">Range</span> <span class="n">age</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">userid</span> <span class="o">=</span> <span class="n">userid</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">username</span> <span class="o">=</span> <span class="n">username</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">age</span> <span class="o">=</span> <span class="n">age</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="o">/**</span> <span class="n">以下省略getter</span> <span class="n">setter方法</span> <span class="o">*/</span>
|
||
|
||
<span class="o">}</span>
|
||
|
||
|
||
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">200001</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">,</span> <span class="k">new</span> <span class="nf">IntRange</span><span class="o">(</span><span class="mi">14</span><span class="o">,</span> <span class="mi">36</span><span class="o">))</span> <span class="o">等价于</span>
|
||
<span class="n">FilterNode</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="s">"userid"</span><span class="o">,</span> <span class="mi">200001</span><span class="o">).</span><span class="na">and</span><span class="o">(</span><span class="s">"username"</span><span class="o">,</span> <span class="n">FilterExpress</span><span class="o">.</span><span class="na">LIKE</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">).</span><span class="na">and</span><span class="o">(</span><span class="s">"age"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Range</span><span class="o">.</span><span class="na">IntRange</span><span class="o">(</span><span class="mi">14</span><span class="o">,</span> <span class="mi">36</span><span class="o">))</span>
|
||
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">200001</span><span class="o">,</span><span class="s">"redkale"</span><span class="o">,</span><span class="k">new</span> <span class="nf">IntRange</span><span class="o">(</span><span class="mi">14</span><span class="o">,</span><span class="mi">36</span><span class="o">))</span> <span class="o">等价于</span> <span class="s">"WHERE userid=200001 AND username LIKE '%redkale%' AND age BETWEEN 14 AND 36"</span>
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">200001</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">,</span> <span class="kc">null</span><span class="o">)</span> <span class="o">等价于</span> <span class="s">"WHERE userid = 200001 AND username LIKE '%redkale%'"</span>
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">,</span> <span class="kc">null</span><span class="o">)</span> <span class="o">等价于</span> <span class="s">"WHERE username LIKE '%redkale%'"</span>
|
||
|
||
</pre></div>
|
||
<p> 如上定义UserBean过滤条件,当非数值类字段值为null、字符串值为空、数值类字段值小于@FilterColumn.least()值(least的默认值为1)都不会构建成过滤条件。@FilterColumn.express根据字段的类型有不同的默认值,若字段类型为Collection子类或数组则express默认为FilterExpress.IN;若字段类型为Range的子类则express默认为FilterExpress.BETWEEN;其他类型则express默认为FilterExpress.EQUAL。默认字段之间是AND关系,若想使用OR关系则需要使用@FilterGroup进行标记:</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserBean</span> <span class="kd">implements</span> <span class="n">FilterBean</span> <span class="o">{</span>
|
||
|
||
<span class="kd">private</span> <span class="kt">int</span> <span class="n">userid</span><span class="o">;</span>
|
||
|
||
<span class="nd">@FilterGroup</span><span class="o">(</span><span class="s">"[OR]a"</span><span class="o">)</span>
|
||
<span class="nd">@FilterColumn</span><span class="o">(</span><span class="n">express</span> <span class="o">=</span> <span class="n">FilterExpress</span><span class="o">.</span><span class="na">LIKE</span><span class="o">)</span>
|
||
<span class="kd">private</span> <span class="n">String</span> <span class="n">username</span><span class="o">;</span>
|
||
|
||
<span class="nd">@FilterGroup</span><span class="o">(</span><span class="s">"[OR]a"</span><span class="o">)</span>
|
||
<span class="kd">private</span> <span class="n">Range</span> <span class="n">age</span><span class="o">;</span>
|
||
|
||
<span class="kd">public</span> <span class="nf">UserBean</span><span class="o">(</span><span class="kt">int</span> <span class="n">userid</span><span class="o">,</span> <span class="n">String</span> <span class="n">username</span><span class="o">,</span> <span class="n">Range</span> <span class="n">age</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">userid</span> <span class="o">=</span> <span class="n">userid</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">username</span> <span class="o">=</span> <span class="n">username</span><span class="o">;</span>
|
||
<span class="k">this</span><span class="o">.</span><span class="na">age</span> <span class="o">=</span> <span class="n">age</span><span class="o">;</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="o">/**</span> <span class="n">以下省略getter</span> <span class="n">setter方法</span> <span class="o">*/</span>
|
||
|
||
<span class="o">}</span>
|
||
|
||
|
||
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">200001</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">,</span> <span class="k">new</span> <span class="nf">IntRange</span><span class="o">(</span><span class="mi">14</span><span class="o">,</span> <span class="mi">36</span><span class="o">))</span> <span class="o">等价于</span>
|
||
<span class="n">FilterNode</span> <span class="n">orNode</span> <span class="o">=</span> <span class="n">FilterNode</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="s">"username"</span> <span class="o">,</span> <span class="n">FilterExpress</span><span class="o">.</span><span class="na">LIKE</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">).</span><span class="na">or</span><span class="o">(</span><span class="s">"age"</span><span class="o">,</span> <span class="k">new</span> <span class="n">Range</span><span class="o">.</span><span class="na">IntRange</span><span class="o">(</span><span class="mi">14</span><span class="o">,</span> <span class="mi">36</span><span class="o">));</span>
|
||
<span class="n">FilterNode</span> <span class="n">node</span> <span class="o">=</span> <span class="n">FilterNode</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="s">"userid"</span><span class="o">,</span> <span class="mi">200001</span><span class="o">).</span><span class="na">and</span><span class="o">(</span><span class="n">orNode</span><span class="o">));</span>
|
||
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">200001</span><span class="o">,</span><span class="s">"redkale"</span><span class="o">,</span><span class="k">new</span> <span class="nf">IntRange</span><span class="o">(</span><span class="mi">14</span><span class="o">,</span><span class="mi">36</span><span class="o">))</span> <span class="o">等价于</span> <span class="s">"WHERE userid=200001 AND (username LIKE '%redkale%' OR age BETWEEN 14 AND 36)"</span>
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">200001</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">,</span> <span class="kc">null</span><span class="o">)</span> <span class="o">等价于</span> <span class="s">"WHERE userid = 200001 AND username LIKE '%redkale%'"</span>
|
||
<span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">,</span> <span class="kc">null</span><span class="o">)</span> <span class="o">等价于</span> <span class="s">"WHERE username LIKE '%redkale%'"</span>
|
||
|
||
|
||
<span class="n">source</span><span class="o">.</span><span class="na">getNumberResult</span><span class="o">(</span><span class="n">User</span><span class="o">.</span><span class="k">class</span><span class="o">,</span> <span class="n">FilterFunc</span><span class="o">.</span><span class="na">COUNT</span><span class="o">,</span> <span class="kc">null</span><span class="o">,</span> <span class="k">new</span> <span class="nf">UserBean</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="s">"redkale"</span><span class="o">,</span> <span class="k">new</span> <span class="nf">IntRange</span><span class="o">(</span><span class="mi">14</span><span class="o">,</span> <span class="mi">36</span><span class="o">))).</span><span class="na">intValue</span><span class="o">()</span> <span class="o">等价于</span>
|
||
<span class="s">"SELECT COUNT(*) FROM user WHERE username LIKE '%redkale%' AND age BETWEEN 14 AND 36"</span>
|
||
</pre></div>
|
||
<p> 如上@FilterGroup 的value 必须是[OR]或者[AND]开头,没有标记@FilterGroup的字段等价于标记了@FilterGroup(value = "[AND]")。[AND]、[OR]后面的字符串为GROUP_NAME,默认的GROUP_NAME为空字符串。如上"[OR]a"可以直接使用"[OR]",有多个[OR]或者[AND]则需要加上不同的NAME。</p>
|
||
|
||
<h3><a id="source_cachesource" class="anchor" href="#" aria-hidden="true"></a>CacheSource 入门</h3>
|
||
<p> CacheSource同Memcached类似,像一个带有过期功能地Map容器,存放key-value数据。常见的使用场景就是存放HTTP的Session信息。Redkale把用户会话信息数据当做业务数据处理,而不是接入层的数据。WebSocket的连接态数据也是用CacheSource存储。key为WebSocket的groupid,value为WebSocket服务端节点的IP地址列表。</p>
|
||
<div class="highlight"><pre><span class="kd">public</span> <span class="kd">class</span> <span class="nc">UserService</span> <span class="kd">implements</span> <span class="n">Service</span> <span class="o">{</span>
|
||
|
||
<span class="c1">//用户简单信息缓存</span>
|
||
<span class="kd">private</span> <span class="kd">final</span> <span class="n">Map</span><span class="o"><</span><span class="n">Integer</span><span class="o">,</span> <span class="n">UserInfo</span><span class="o">></span> <span class="n">users</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ConcurrentHashMap</span><span class="o"><>();</span>
|
||
|
||
<span class="c1">//使用CacheSource必须要指明泛型</span>
|
||
<span class="nd">@Resource</span><span class="o">(</span><span class="n">name</span> <span class="o">=</span> <span class="s">"usersessions"</span><span class="o">)</span>
|
||
<span class="kd">protected</span> <span class="n">CacheSource</span><span class="o"><</span><span class="n">String</span><span class="o">,</span> <span class="n">Integer</span><span class="o">></span> <span class="n">sessions</span><span class="o">;</span>
|
||
|
||
<span class="c1">//登录</span>
|
||
<span class="kd">public</span> <span class="n">RetResult</span><span class="o"><</span><span class="n">UserInfo</span><span class="o">></span> <span class="nf">login</span><span class="o">(</span><span class="n">LoginBean</span> <span class="n">bean</span><span class="o">)</span> <span class="o">{</span> <span class="c1">//bean.sessionid 在接入层进行赋值</span>
|
||
<span class="n">UserInfo</span> <span class="n">user</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>
|
||
<span class="c1">// 登陆逻辑 user = ...</span>
|
||
<span class="n">users</span><span class="o">.</span><span class="na">put</span><span class="o">(</span><span class="n">user</span><span class="o">.</span><span class="na">getUserid</span><span class="o">(),</span> <span class="n">user</span><span class="o">);</span>
|
||
<span class="n">sessions</span><span class="o">.</span><span class="na">set</span><span class="o">(</span><span class="mi">600</span><span class="o">,</span> <span class="n">bean</span><span class="o">.</span><span class="na">getSessionid</span><span class="o">(),</span> <span class="n">user</span><span class="o">.</span><span class="na">getUserid</span><span class="o">());</span> <span class="c1">//session过期时间设置为10分钟</span>
|
||
<span class="k">return</span> <span class="k">new</span> <span class="n">RetResult</span><span class="o"><>(</span><span class="n">user</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="c1">//获取当前用户信息</span>
|
||
<span class="kd">public</span> <span class="n">UserInfo</span> <span class="nf">current</span><span class="o">(</span><span class="n">String</span> <span class="n">sessionid</span><span class="o">)</span> <span class="o">{</span> <span class="c1">//给HTTP的BaseServlet用</span>
|
||
<span class="n">Integer</span> <span class="n">userid</span> <span class="o">=</span> <span class="n">sessions</span><span class="o">.</span><span class="na">getAndRefresh</span><span class="o">(</span><span class="n">sessionid</span><span class="o">);</span>
|
||
<span class="k">return</span> <span class="n">userid</span> <span class="o">==</span> <span class="kc">null</span> <span class="o">?</span> <span class="kc">null</span> <span class="o">:</span> <span class="n">users</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">userid</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
|
||
<span class="c1">//注销</span>
|
||
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">logout</span><span class="o">(</span><span class="n">String</span> <span class="n">sessionid</span><span class="o">)</span> <span class="o">{</span>
|
||
<span class="n">sessions</span><span class="o">.</span><span class="na">remove</span><span class="o">(</span><span class="n">sessionid</span><span class="o">);</span>
|
||
<span class="o">}</span>
|
||
<span class="o">}</span></pre></div>
|
||
<p> 以上是个简单的范例,用于用户模块存放sessionid。</p>
|
||
|
||
<h3><a id="source_confxml" href="#" aria-hidden="true"></a>persistence.xml 配置说明</h3>
|
||
<div class="highlight"><pre><span class="c"><!-- 其配置算是标准的JPA配置文件的缩略版 --></span>
|
||
<span class="nt"><persistence></span>
|
||
<span class="c"><!-- 系统基本库 --></span>
|
||
<span class="nt"><persistence-unit</span> <span class="na">name=</span><span class="s">"demouser"</span><span class="nt">></span>
|
||
<span class="c"><!-- 为NONE表示不启动缓存,@Cacheable 失效; 非NONE值(通常用ALL)表示开启缓存。 --></span>
|
||
<span class="nt"><shared-cache-mode></span>NONE<span class="nt"></shared-cache-mode></span>
|
||
<span class="nt"><properties></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.url"</span> <span class="na">value=</span><span class="s">"jdbc:mysql://127.0.0.1:3306/dbuser?characterEncoding=utf8"</span><span class="nt">/></span>
|
||
<span class="c"><!-- </span>
|
||
<span class="c"> javax.persistence.jdbc.driver在JPA的值是JDBC驱动,Redkale有所不同,值应该是javax.sql.DataSource的子类。 </span>
|
||
<span class="c"> 为了兼容用户习惯,Redkale内置常见JDBC驱动到javax.sql.DataSource的映射关系:</span>
|
||
<span class="c"> com.mysql.jdbc.Driver —————— com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</span>
|
||
<span class="c"> org.mariadb.jdbc.Driver —————— org.mariadb.jdbc.MySQLDataSource</span>
|
||
<span class="c"> oracle.jdbc.driver.OracleDriver —————— oracle.jdbc.pool.OracleConnectionPoolDataSource</span>
|
||
<span class="c"> com.microsoft.sqlserver.jdbc.SQLServerDriver —————— com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource</span>
|
||
<span class="c"> 因此 com.mysql.jdbc.Driver 会被自动转换成 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource</span>
|
||
<span class="c"> --></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.driver"</span> <span class="na">value=</span><span class="s">"com.mysql.jdbc.Driver"</span><span class="nt">/></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.user"</span> <span class="na">value=</span><span class="s">"root"</span><span class="nt">/></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.password"</span> <span class="na">value=</span><span class="s">"123456"</span><span class="nt">/></span>
|
||
<span class="c"><!-- </span>
|
||
<span class="c"> 最大连接数,默认值:CPU数*16</span>
|
||
<span class="c"> <property name="javax.persistence.connections.limit" value="32"/></span>
|
||
<span class="c"> --></span>
|
||
<span class="c"><!-- </span>
|
||
<span class="c"> 包含的SQL模板,相当于反向LIKE,不同的JDBC驱动的SQL语句不一样,Redkale内置了MySQL、Oracle、Sqlserver的语句</span>
|
||
<span class="c"> <property name="javax.persistence.contain.sqltemplate" value="LOCATE(${keystr}, ${column}) > 0"/></span>
|
||
<span class="c"> <property name="javax.persistence.notcontain.sqltemplate" value="LOCATE(${keystr}, ${column}) = 0"/></span>
|
||
<span class="c"> --></span>
|
||
<span class="nt"></properties></span>
|
||
<span class="nt"></persistence-unit></span>
|
||
<span class="c"><!-- IM消息库 --></span>
|
||
<span class="nt"><persistence-unit</span> <span class="na">name=</span><span class="s">"demoim"</span><span class="nt">></span>
|
||
<span class="nt"><shared-cache-mode></span>NONE<span class="nt"></shared-cache-mode></span>
|
||
<span class="nt"><properties></span>
|
||
<span class="c"><!-- jdbc:mysql://127.0.0.1:3306/dbim?autoReconnect=true&amp;autoReconnectForPools=true&amp;characterEncoding=utf8 --></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.url"</span> <span class="na">value=</span><span class="s">"jdbc:mysql://127.0.0.1:3306/dbim?characterEncoding=utf8"</span><span class="nt">/></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.driver"</span> <span class="na">value=</span><span class="s">"com.mysql.jdbc.Driver"</span><span class="nt">/></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.user"</span> <span class="na">value=</span><span class="s">"root"</span><span class="nt">/></span>
|
||
<span class="nt"><property</span> <span class="na">name=</span><span class="s">"javax.persistence.jdbc.password"</span> <span class="na">value=</span><span class="s">"123456"</span><span class="nt">/></span>
|
||
<span class="nt"></properties></span>
|
||
<span class="nt"></persistence-unit></span>
|
||
<span class="nt"></persistence></span></pre></div>
|
||
|
||
<footer class="site-footer">
|
||
<span class="site-footer-owner"> 欢迎加入Redkale QQ群: 527523235</span>
|
||
</footer>
|
||
|
||
</section>
|
||
|
||
<script>
|
||
var _hmt = _hmt || [];
|
||
(function () {
|
||
var hm = document.createElement("script");
|
||
hm.src = "//hm.baidu.com/hm.js?b4e05d7de8b5f3401dd93e3c6b35ffa5";
|
||
var s = document.getElementsByTagName("script")[0];
|
||
s.parentNode.insertBefore(hm, s);
|
||
})();
|
||
</script>
|
||
</body>
|
||
</html>
|