Giter Site home page Giter Site logo

mybatis-shards's People

Contributors

fengkuok avatar guofengcn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mybatis-shards's Issues

分页查询结果集有误

分页查询时可能出现结果集重复或者有些数据干脆取不出来的问题。通常会在最后一页较为多见。暂时还没有想到应对策略。

欢迎大家来一起讨论

欢迎大家过来一起讨论!

目前遇到一个如何合并结果集的问题:
当从多个库中查询出结果后,如何将结果集进行group by,count(xx),sum(xx)等等运算,大家有什么好的想法?

我目前想到的有:
1、对于分页查询时统计总数的问题,可按契约优先原则,规定sql map中的staement id为“findAllUser.count”,这样就可以知道此SQL的结果集要进行RowCount处理。

2、手动设置结果集合并策略。这个是最保守的办法,当然,加大了代码量。

3、最理想的办法是根据SQL语句,智能分析出需要采用哪些合并策略。分析SQL语句可以用现成的JSqlParser来完成,但是...这个还需要很多实践!当然了,嵌套SQL语句恐怕是无法支持了。

1.0.0-SNAPSHOT版本是否有连接未close(未归还连接池)的问题?

您好,我在公司的一份比较早期的工程中发现 有在使用这个框架的1.0.0-SNAPSHOT版本,使用的DBCP框架。这个应用在生产环境中,持续输出以下日志,该日志并不是异常,而是 DBCP针对被borrow出去的连接进行跟踪,如果超过一定时间未归还,则直接丢弃掉。这个堆栈代表的是该连接是哪次调用中申请的,不是普通异常中的堆栈。从这个可以看到应用是经过了mybatis-shards框架再到mybatis中申请的。

想和作者确认一下 是否有发现1.0.0-SNAPSHOT版本 中是否有此问题。borrow连接后未归还。

org.apache.commons.dbcp.AbandonedTrace$AbandonedObjectException: DBCP object created 2023-02-03 16:50:35 by the following code was never closed:
at org.apache.commons.dbcp.AbandonedTrace.init(AbandonedTrace.java:90)
at org.apache.commons.dbcp.AbandonedTrace.<init>(AbandonedTrace.java:73)
at org.apache.commons.dbcp.DelegatingDatabaseMetaData.<init>(DelegatingDatabaseMetaData.java:52)
at org.apache.commons.dbcp.DelegatingConnection.getMetaData(DelegatingConnection.java:345)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.getMetaData(PoolingDataSource.java:245)
at net.sf.log4jdbc.ConnectionSpy.getMetaData(ConnectionSpy.java:298)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getNextResultSet(DefaultResultSetHandler.java:245)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:184)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
at sun.reflect.GeneratedMethodAccessor96.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
at com.sun.proxy.$Proxy267.query(Unknown Source)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:136)
at sun.reflect.GeneratedMethodAccessor85.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
at com.xx.bpo.common.page.PageableInterceptor.intercept(PageableInterceptor.java:84)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy266.query(Unknown Source)
at sun.reflect.GeneratedMethodAccessor85.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
at com.xx.bpo.interceptor.TimerInterceptor.intercept(TimerInterceptor.java:50)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy266.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
at com.xx.bpo.common.page.PageableInterceptor.findCount(PageableInterceptor.java:217)
at com.xx.bpo.common.page.PageableInterceptor.intercept(PageableInterceptor.java:57)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy266.query(Unknown Source)
at sun.reflect.GeneratedMethodAccessor85.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49)
at com.xx.bpo.interceptor.TimerInterceptor.intercept(TimerInterceptor.java:50)
at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
at com.sun.proxy.$Proxy266.query(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
at sun.reflect.GeneratedMethodAccessor84.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.makersoft.shards.ShardImpl$SqlSessionInterceptor.invoke(ShardImpl.java:100)
at com.sun.proxy.$Proxy79.selectOne(Unknown Source)
at org.makersoft.shards.select.impl.ShardSelectImpl$2.execute(ShardSelectImpl.java:106)
at org.makersoft.shards.strategy.access.impl.SequentialShardAccessStrategy.apply(SequentialShardAccessStrategy.java:38)
at org.makersoft.shards.select.impl.ShardSelectImpl.getSingleResult(ShardSelectImpl.java:115)
at org.makersoft.shards.session.impl.ShardedSqlSessionImpl.selectOne(ShardedSqlSessionImpl.java:269)
at sun.reflect.GeneratedMethodAccessor84.invoke(Unknown So
... 

when mybatis-shards for G.A releasing ?

@fengkuok , thanks a lot for sharding solution for mybatis as a big step beyond shardbatis. here comes our doubt that when the G.A releasing just like 1.0, looking forward to that with more document related.

shardedSqlSessionFactory需要配置多个ShardStrategyFactory

 <bean id="shardedSqlSessionFactory" class="org.makersoft.shards.spring.ShardedSqlSessionFactoryBean">
        <property name="mapperLocations" value="classpath*:/mybatis/mapper/*Mapper.xml"/>
        <property name="typeAliasesPackage" value="org.makersoft.shards.domain" />
        <property name="dataSources" ref="dsMap"/>
        <property name="shardStrategyFactory">
            <bean class="org.makersoft.shards.strategy.UserShardStrategyFactory"/>
        </property>
        <property name="idGenerator">
            <bean class="org.makersoft.shards.id.uuid.ShardedUUIDGenerator"/>
        </property>
 </bean>

不仅user表要分片,还有其它的表也要分片,要怎么写配置.最好能提供一个unit case演示如何操作2表带分区的表。
比如我会写一个org.makersoft.shards.strategy.ProductShardStrategyFactory.

扩展Spring schema

1、为方便Shards配置,扩展Spring schema。
2、依据扩展schema重构配置文件。

单元测试重构

1、配置文件重构
2、测试基础类重构
3、测试方法重构

对order by语句的支持

实现步骤:

1)、采用mybatis拦截器机制,拦截SQL语句,采用jsqlpaser解析出order by子语句。
2)、将多数据源查询的结果集按sql解析出的排序方式进行重新排序。

注意事项:

结果集对象中必须包含排序字段,且该字段实现了Comparable接口。

遗留问题:

如何对多列排序进行计算?进行嵌套多次排序?

例如如下数据:
————————————
id | age | birthday |
————————————
1 | 20 | 06-25 |
————————————
2 | 20 | 07-20 |
————————————
3 | 19 | 03-21 |
————————————
4 | 19 | 01-20 |
————————————
5 | 21 | 12-27 |
————————————

执行SQL语句:select t.age,t.birthday from user t order by t.age desc,t.birthday asc

结果集:
————————————
id | age | birthday |
————————————
5 | 21 | 12-27 |
————————————
1 | 20 | 06-25 |
————————————
2 | 20 | 07-20 |
————————————
4 | 19 | 01-20 |
————————————
3 | 19 | 03-21 |
————————————

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.