meituan-dianping / zebra Goto Github PK
View Code? Open in Web Editor NEW美团点评集团统一使用的MySQL数据库访问层的中间件。主要提供对业务开发透明、读写分库、分库分表能力,并提供了端到端SQL监控的集成方案。
License: Apache License 2.0
美团点评集团统一使用的MySQL数据库访问层的中间件。主要提供对业务开发透明、读写分库、分库分表能力,并提供了端到端SQL监控的集成方案。
License: Apache License 2.0
请问下我有一个date_time时间字段:begin_time,我想已begin_time为纬度,进行分表,表我会提前生成,每天一个表:table_yyyyMMdd,这种方式支持吗?
目前在使用中发现当与mysql8版本的数据库连接时如果使用c3p0的连接池则会报错,即使把c3p0的版本换成0.9.5版本依然会有错,请知悉。
Lines 94 to 98 in 33d74b8
CVE-2017-3523 CVE-2018-3258 CVE-2019-2692 CVE-2020-2875 CVE-2020-2934
Recommended upgrade version:8.0.20
分库分表不支持子查询,例如:select * from tableA where id in(select id from tableB)
目前的实现方案有:阿里巴巴开源的tddl,大众点评开源的zebra,当当网开源的sharding-jdbc。需要注意的是tddl的开源版本只有读写分离功能,没有分库分表,且开源版本已经不再维护。大众点评的zebra开源版本代码已经很久更新,基本上处于停滞的状态。当当网的sharding-jdbc目前算是做的比较好的,代码时有更新,文档资料比较全。
ShardResultSet.setMemoryData的List是空时(全表查询,但没有查到数据),getMetaData会从缓存的数据里取get(0)导致报错
hello
有没有架构图和压测结果文档?
SQL解析请问下是用druid开源的,还是自己实现的?
另能否有个QQ等交流工具,方便交流 :)
你们开源了Zebra和DBProxy,公司内部应用是咋分工的,两个一起用?那个性能(包括tps、时延等)更好,有测试过吗?
谢谢
我有两个问题:
迁移:
扩容:
在分库分表的方案中,zebra是如何支持扩容的,这里面可能有两个方面
更改路由
Lines 155 to 157 in 33d74b8
Recommended upgrade version:4.5.13
因为目前用的到的只有mybatis异步查询这一块。
您好:
我是360代码卫士的工作人员,在我们的开源项目代码审计过程中,发现Zebra多处处理xml数据时没有禁用外部实体。详细信息如下:
在Zebra-master\zebra-admin-web\src\main\java\com\dianping\zebra\administrator\util\JaxbUtils.java文件中的jaxbReadXml方法中
该方法是将xml转化为java,在JdbcrefController.java文件的findJdbcrefDetil方法中调用了该函数
groupValue变量是从数据库中取的,用户可以通过插入任意值来进行xxe攻击(由于项目我也没搭建起来,不敢百分百确认,这个需要你们确认下)。
同样的问题也存在于
Zebra-master\zebra-client\src\main\java\com\dianping\zebra\util\JaxbUtils.java 43行
Zebra-master\zebra-client\src\main\java\com\dianping\zebra\group\config\datasource\transform\DefaultSaxParser.java 81行
Zebra-master\zebra-client\src\main\java\com\dianping\zebra\group\config\system\transform\DefaultSaxParser.java 85行
请问下zebra的jdk版本是不是1.6,那1.7支持吗?
请问,什么时候上呢?
node:v10.16.0
npm:6.13.1
$ npm run dev
[email protected] dev /Users/calvin/prj/github/Zebra/zebra-admin-web/src/main/webapp/app
webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] dev: webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
10 silly lifecycle [email protected]dev: Args: [ '-c',dev: Returned: code: 1 signal: null
10 silly lifecycle 'webpack-dev-server --inline --progress --config build/webpack.dev.conf.js' ]
11 silly lifecycle [email protected]
12 info lifecycle [email protected]~dev: Failed to exec dev script
13 verbose stack Error: [email protected] dev: webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
13 verbose stack Exit status 1
13 verbose stack at EventEmitter. (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:332:16)
13 verbose stack at EventEmitter.emit (events.js:198:13)
13 verbose stack at ChildProcess. (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack at ChildProcess.emit (events.js:198:13)
13 verbose stack at maybeClose (internal/child_process.js:982:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:259:5)
14 verbose pkgid [email protected]
1
com.dianping.zebra.shard.jdbc.ShardStatement#executeQueryByOriginal
此方法中isSingleTarget(routerTarget)情况下打印了db,sql日志;希望else情况下也将db、sql日志打印出来。谢谢!
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("db:" + targetedSql.getDatabaseName());
LOGGER.debug("sql:" + executableSql);
}
if (isSingleTarget(routerTarget)) {
// if has only one sql,then serial execute it
for (RouterTarget targetedSql : routerTarget.getSqls()) {
for (String executableSql : targetedSql.getSqls()) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("db:" + targetedSql.getDatabaseName());
LOGGER.debug("sql:" + executableSql);
}
Connection conn = connection.getRealConnection(targetedSql.getDatabaseName(), autoCommit);
Statement stmt = createStatement(conn);
actualStatements.add(stmt);
resultList.add(stmt.executeQuery(executableSql));
}
}
}
CVE-2019-8331 CVE-2018-14040 CVE-2018-20677 CVE-2018-20676 CVE-2016-10735
Recommended upgrade version:3.4.1
大众点评 www.dianping.com
美团 www.meituan.com
不要在此issue里面提各种问题,谢谢配合。
没有进入分页拦截器
mybatis 标签是select标签,sql其实用的update,发现mybatis 处理结果那段代码一直死循环。
具体原因我就不多说了,描述下现象先
public static File toFile(URL url) {
logger.info("*********url:"+url.getFile()+""+url.getProtocol());
if (url == null || !url.getProtocol().equals("file")) {
return null;
} else {
String filename = url.getFile().replace('/', File.separatorChar);
int pos = 0;
while ((pos = filename.indexOf('%', pos)) >= 0) {
if (pos + 2 < filename.length()) {
String hexStr = filename.substring(pos + 1, pos + 3);
char ch = (char) Integer.parseInt(hexStr, 16);
filename = filename.substring(0, pos) + ch + filename.substring(pos + 3);
}
}
return new File(filename);
}
}
打成jar后,url.getProtocol()=“jar”,然后报错,应该怎么解决呢
catFilter打印sql参数时,List
这个主要应用在什么场景下?
个人感觉在项目中改了配置文件重新部署,重新加载就ok?还是在不重新部署,只修改properties文件?
public class ZooKeeperConnection {
private Logger logger = LoggerFactory.getLogger(this.getClass().getName());
private ZooKeeper zooKeeper;
private int sessionTimeout = 50000;
private final CountDownLatch connectedSignal = new CountDownLatch(1);
**public ZooKeeper connect(String host) throws IOException, InterruptedException {
**zooKeeper = new ZooKeeper(host, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
connectedSignal.countDown();
}
}
});
connectedSignal.await();
return zooKeeper;**
}**
public void close() {
try {
zooKeeper.close();
} catch (InterruptedException e) {
logger.error("zookeeper connection close fail!", e);
}
}
}
Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in void matching [java.lang.Integer, java.lang.String, java.lang.Integer] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createByConstructorSignature(DefaultResultSetHandler.java:668) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:621) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:594) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:396) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:355) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:330) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:303) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:196) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.ReuseExecutor.doQuery(ReuseExecutor.java:60) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:326) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:136) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77) ~[mybatis-3.4.6.jar:3.4.6] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_191] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_191] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_191] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_191] at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433) ~[mybatis-spring-1.3.1.jar:1.3.1] at com.sun.proxy.$Proxy85.selectOne(Unknown Source) ~[?:?] at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:166) ~[mybatis-spring-1.3.1.jar:1.3.1] at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:83) ~[mybatis-3.4.6.jar:3.4.6] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59) ~[mybatis-3.4.6.jar:3.4.6] at com.sun.proxy.$Proxy89.findUserById2(Unknown Source) ~[?:?] at com.maoyan.service.impl.UserServiceImpl.asynGetUser(UserServiceImpl.java:24) ~[classes/:?] at com.maoyan.service.movie.walle.biz.com.maoyan.biz.impl.UserBizImpl.asynGetUserInfo(UserBizImpl.java:25) ~[classes/:?] at com.maoyan.service.movie.walle.provider.controller.MyController.asynUserInfo(MyController.java:28) ~[classes/:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_191] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_191] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_191] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_191] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) ~[spring-web-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.13.RELEASE.jar:4.3.13.RELEASE] ... 51 more
我的mapper接口,我采用的是纯注解开发mapper,没有使用配置文件
`@Mapper
public interface IUserDAO {
@select("select * from user where id=#{id}")
User findUserById(Integer id);
@Select("select * from user where id=#{id}")
@TargetMethod(name = "findUserById")
void findUserById2(@Param("id") Integer id, AsyncDaoCallback<User> callback);
}`
异步方法void的话,那么resultType是void就没有构造函数,无法构造出对象
是我姿势错了吗?
试过 void query(PageModel pageModel,Map<String,Object> params);
mapper里配parameterType=“map”不行 什么也不配也不行。
试过 void query(PageModel pageModel,@param("name") name);
mapper里什么也不配,依然报错
报错都是
“org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'xxx' in 'class [Ljava.lang.Object;'”
配置集中管理 开源没
Lines 95 to 97 in 33d74b8
CVE-2017-3523 CVE-2018-3258 CVE-2019-2692 CVE-2020-2875 CVE-2020-2934
Recommended upgrade version:8.0.20
问一个不成熟的问题,shardingJDBC已经算是久经考验的中间件了,18年也进了Apache,发展的挺好。那zebra是为了解决一些什么痛点问题而发开的呢,还是更多为了适配大众点评自己的业务?另,zebra-dao提供的RowBoundsWithCallback和RowBoundsWithFuture,可以理解成是异步的JDBC么
辅维度不支持写操作,如果辅维度和主维度是一套物理表的话就可以执行写操作。
router-rule配置里的isMaster是什么意思? 文档上没找到
mvn仓库更新不了,给个镜像地址
CatFilter 打点时,记录的preparedStatement的参数,是null的记录的是NullParamContext,这个转换时打印的是类型数据,而不是字符串null,建议重写toString方法
没人更新项目了吗?还是开始闭源了
sql语句的重点是用了useGeneratedKeys="true", 和 ON duplicate KEY UPDATE
详细描述:https://sdcuike.blog.csdn.net/article/details/115789539
Zebra管理平台 ->读写分离命名,JdbcRef 如果配置了下划线会导致无法区分主从,如命名 :zebra_demo,会报
java.sql.SQLException: Write dataSource is currently in the maintaining stage. at com.dianping.zebra.util.JDBCUtils.throwWrappedSQLException(JDBCUtils.java:62) at com.dianping.zebra.group.jdbc.GroupPreparedStatement.executeUpdate(GroupPreparedStatement.java:220) at com.dianping.zebra.sample.jdbc.GroupDataSourceSample.insertValue(GroupDataSourceSample.java:72) at com.dianping.zebra.sample.jdbc.GroupDataSourceSample.groupTest(GroupDataSourceSample.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
如果命名为 :zebra-demo就会没事。
若是不用spring的插件,请问,异步如何管理事物
getUpdateCount应该是多结果集时用到,常规更新应该还是-1,或是调用内部持有的statement的getUpdateCount
在结合hibernate使用该组件的时候,发现开启hibernate的自动生成表功能后,报出空指针异常,具体看下来是因为组件的ShardDatabaseMetaData实现为空,这里是使用错误吗?有解决方案吗?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.