Giter Site home page Giter Site logo

mango's Introduction

Mango: Distributed ORM Framework for Java

Build Status Coverage Status License

Fast, simple, reliable. Mango is a high-performance Distributed ORM Framework. Mango makes it easier to use a relational database with object-oriented applications. Performance and Simplicity are the biggest advantage of the Mango data mapper over object relational mapping tools. In our payment system, we use mango to build a distributed payment order system that can handle 120000+ payment order per second.

Documentation is at http://mango.jfaster.org/

Requires JDK 1.8 or higher.

Latest release

The most recent release is Mango 2.0.1, released Jul 14, 2020.

To add a dependency on Mango using Maven, use the following:

<dependency>
    <groupId>org.jfaster</groupId>
    <artifactId>mango</artifactId>
    <version>2.0.1</version>
</dependency>

To add a dependency using Gradle:

dependencies {
    compile 'org.jfaster:mango:2.0.1'
}

JMH Benchmarks

Microbenchmarks were created to isolate and measure the overhead of ORM framework using the JMH microbenchmark framework developed by the Oracle JVM performance team. You can checkout the Mango benchmark project for details and review/run the benchmarks yourself.

  • Jdbc means using only native jdbc API, do not use any ORM frameworks.
  • One Query Cycle is defined as single select id, name, age from user where id = ?.
  • One Update Cycle is defined as single update user set age = ? where id = ?.
1 Versions: mango 1.3.5, spring-jdbc 4.0.5, mybatis 3.4.0, hsqldb 2.3.1, Java 1.7.0_25
2 Java options: -server -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms1096m -Xmx1096m

mango's People

Contributors

liangyanghe 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  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

mango's Issues

如何设置批量提交

我有这样一个场景,就是需要针对日志文件解析后,插入到对应数据库。但是如果按照demo的方式来做,每获取一条日志进行一次插入操作,这样时间上非常耗时,数据量有100W。

意见:1集成spring事务管理 and 2.sql文本文件

你好,十分感谢能开源出这么优秀且简洁的框架。在使用过程中,我有两个想法
1.集成spring 事务管理,这个其他同学也提到了,自己写aop的确不难。但是如果加到这个项目中,使用人员也不用去重复实现了。
2.就是把sql直接注解在dao的接口方法上,这个很直观,但是有个弊端就是sql比较长或者有sql拼接的话,写在java文件里不是很美观。我想可不可以参考一下mybatis的做法,把接口和sql分开。(当然也可以同时保留注解和sql文件,而注解的优先级高)。这个我也打算自己实现一下,到时候你们看看能不能合并呀:)
再次感谢你们~

同一SQL查询所有oracle数据库分表

之前循环将分库下标当做一个变量传进来查询发现会有ORA-00933这种错误出现,不过这种办法在mysql中就没有任何问题。新手求大神解惑,万分感谢。

主库从库配置中多个库的情况如何配置

<!-- 配置主从数据源工厂 --> <bean id="masterSlaveDataSourceFactory" class="org.jfaster.mango.datasource.MasterSlaveDataSourceFactory"> <property name="name" value="dsf2" /> <property name="master"> <bean class="org.jfaster.mango.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mango_example_master" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> </property> <property name="slaves"> <list> <bean class="org.jfaster.mango.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mango_example_slave1" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <bean class="org.jfaster.mango.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mango_example_slave2" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> </list> </property> </bean>

是在master节点里面增加多个org.jfaster.mango.datasource.DriverManagerDataSource吗?

比如我主库有base, trade,td0,td1,td2,td3,td4...N个,slave库也有同样的那么多。该如何配置

SQL参数化建议使用名字

给一个建议 @Sql("insert into fruit(name, num) values(:1, :2)") 能不能写成 @Sql("insert into fruit(name, num) values({name},{num})") 或 @Sql("insert into fruit(name, num) values($name,$num)")

几个有关使用cache的疑问

不错的项目,看文档中有几个疑问,请教下

//包省略

@DB
@Cache(prefix = "user", expire = Hour.class, num = 2)
public interface SingleKeySingeValueDao {

    @CacheIgnored
    @SQL("insert into user(uid, name) values(:1, :2)")
    public int insert(int uid, String name);

    @SQL("delete from user where uid=:1")
    public int delete(@CacheBy int uid);

    @SQL("update user set name=:2 where uid=:1")
    public int update(@CacheBy int uid, String name);

    @SQL("select uid, name from user where uid=:1")
    public User getUser(@CacheBy int uid);

}

1)上面delete,update,getUser时触发SimpleCacheHandler的delete,update,get是由内部sql判定吗,比如sql的select的操作触发SimpleCacheHandler的get,sql的delete对应SimpleCacheHandler的delete,sql的update对应SimpleCacheHandler的set?
2) SimpleCacheHandler的set的参数value是有Dao的方法返回值吗? 比如

@SQL("select uid, name from user where uid=:1")
    public User getUser(@CacheBy int uid); //触发SimpleCacheHandler的set操作, 参数value其实就是User ?

3) @Cache(prefix = "user") prefix指定了被缓存的key前缀, 如果我想表一条记录中2个字段分别想缓存到不同的key该如何配置注解?

咨询一下

想了解一下动态sql使用的是哪种表达式引擎?示例给的不太清楚,对于复杂的判断不太明白

DAO在springboot中Autowired问题

使用
<dependency> <groupId>org.jfaster</groupId> <artifactId>mango-spring-boot-starter</artifactId> <version>0.4</version> </dependency>

有一句WARN日志

WARN [o.s.context.annotation.ConfigurationClassEnhancer] - @Bean method MangoAutoConfiguration.autoCreator is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface. This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class. Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details.

然后导致boot中定义的service类中@Autowired持久层DAO就无法识别到了

请问如何设置Statement的QueryTimeout

在数据库执行需要很长时间时,想要提前终止,该如何设置?我想通过设置Statement的QueryTimeout来达到效果,但没有找到如何设置

test case理解

你好 对于有一些test case 没有看明白。请问您有什么联系方式可以交流一下吗?

关于主从读写分离的疑问

很多场景下需要指定少数方法读从库,这样的话一个 @Usemaster 注解不能满足需求。是否应该考虑通过增加一个 @UseSlave 注解,或者 @Usemaster 增加一个属性的方式来指定该方法走从库读,从而增加灵活性?现在查询默认全部走从库,是否不利于扩展?

编译parser.jjt出现异常

我对这个源码比较感兴趣,于是下载下来打算研究一下。在跑测试的时候发现找不到Parser这个类,后来看了一些博客之后,觉得是要先编译那个parser.jjt文件,是这样吗?
然后,我在编译的时候,出现了一个异常,以下是异常信息:
flycash@flycash-pc:~/git/mango$ javacc src/main/jjtree/parser.jjt
Java Compiler Compiler Version 5.0 (Parser Generator)
(type "javacc" with no arguments for help)
Reading from file src/main/jjtree/parser.jjt . . .
Warning: Line 10, Column 5: Bad option name "TRACK_TOKENS". Option setting will be ignored.
Warning: Line 13, Column 5: Bad option name "MULTI". Option setting will be ignored.
Warning: Line 16, Column 5: Bad option name "VISITOR". Option setting will be ignored.
org.javacc.parser.ParseException: Encountered " "#" "# "" at line 101, column 22.
Was expecting one of:
"throws" ...
":" ...

Detected 1 errors and 3 warnings.
不知道是哪里出了问题。PS:我还是第一次接触javacc这种东西,若是有什么学习资料,万望不吝指点。

框架集成后针对部分引用会出现找不到的情况

最近在了解Mongo,从Github导入到IntellJ后发现有类找不到的情况,例如:
org.jfaster.mango.parser.AbstractExpression 找不到父类SimpleNode,同时也找不到Parse,基本上【org.jfaster.mango.parser】 包下的类都是报错的,这块的依赖库定义没有体现在pom.xml中,能否明确一下这块的引用吗? 谢谢了!

sharding报错 不支持MYSQL 数据库

java.lang.UnsupportedOperationException: Cannot support database type 'MySQL'
at org.apache.shardingsphere.sql.parser.core.parser.SQLParserFactory.newInstance(SQLParserFactory.java:55)
at org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor.towPhaseParse(SQLParserExecutor.java:55)
at org.apache.shardingsphere.sql.parser.core.parser.SQLParserExecutor.execute(SQLParserExecutor.java:47)
at org.apache.shardingsphere.sql.parser.SQLParserEngine.parse0(SQLParserEngine.java:79)
at org.apache.shardingsphere.sql.parser.SQLParserEngine.parse(SQLParserEngine.java:61)
at org.apache.shardingsphere.underlying.route.DataNodeRouter.createRouteContext(DataNodeRouter.java:97)
at org.apache.shardingsphere.underlying.route.DataNodeRouter.executeRoute(DataNodeRouter.java:89)
at org.apache.shardingsphere.underlying.route.DataNodeRouter.route(DataNodeRouter.java:76)
at org.apache.shardingsphere.underlying.pluggble.prepare.PreparedQueryPrepareEngine.route(PreparedQueryPrepareEngine.java:54)
at org.apache.shardingsphere.underlying.pluggble.prepare.BasePrepareEngine.executeRoute(BasePrepareEngine.java:96)
at org.apache.shardingsphere.underlying.pluggble.prepare.BasePrepareEngine.prepare(BasePrepareEngine.java:83)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.prepare(ShardingPreparedStatement.java:183)
at org.apache.shardingsphere.shardingjdbc.jdbc.core.statement.ShardingPreparedStatement.executeQuery(ShardingPreparedStatement.java:116)
at org.jfaster.mango.jdbc.JdbcTemplate.executeQuery(JdbcTemplate.java:150)
at org.jfaster.mango.jdbc.JdbcTemplate.queryForList(JdbcTemplate.java:57)
at org.jfaster.mango.operator.QueryOperator$1.visitForList(QueryOperator.java:106)
at org.jfaster.mango.operator.QueryOperator$QueryVisitor.visit(QueryOperator.java:193)
at org.jfaster.mango.operator.QueryOperator.executeFromDb(QueryOperator.java:102)
at org.jfaster.mango.operator.QueryOperator.execute(QueryOperator.java:93)
at org.jfaster.mango.operator.QueryOperator.execute(QueryOperator.java:72)
at org.jfaster.mango.operator.Mango$MangoInvocationHandler.handleInvocation(Mango.java:371)
at org.jfaster.mango.util.reflect.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:46)

问题:如何调用存储过程

mango 的开发者们,我这边想了解一下如何有调用存储过程,从注解的包中没有看到相关的类,同时使用@Sql("call producer()") 会报出异常,如下:
Caused by: org.jfaster.mango.exception.SqlParserException: Encountered " <TEXT> "call "" at line 1, column 1. Was expecting one of: "insert" ... "delete" ... "update" ... "select" ... "replace" ... "merge" ...

麻烦了!

order by 传递动态参数问题

想使用如下形式实现类似mybatis中的动态传递参数解决一些问题。代码如下:
" #if(:1.order != null) ORDER BY :1.order #end "
" #if(:1.order == null) ORDER BY t1.n_id DESC #end"

参数1是动态的order值,目前发现不支持生成的SQL都是带 引号的值。如:ORDER BY 'ID DESC'.
mybatis提供了${}可以支持 如下 mybatis $解决order by 动态传参
是否有好的解决方式。

多个分库分表数据连接查询支持吗?

如果使用分库分表设计了不止是一张表,比如每个datasource下设置了order_0到order_9这10张表,但是同时又设计了order_detail0到order_detail9这10张表,做关联查询时,支持order_0对应order_dtail_0吗

batch insert问题

我用batch insert的时候,SQL文是一条条执行的,并没有执行jdbc的batch,是需要什么其他配置吗?
我使用了ShardingStrategy
@SQL(insertSql) public Integer insertBatch(@ShardingBy("peopleId") List<OrderEntity> orderEntityList);

`class OrderShardingStrategy implements ShardingStrategy<Integer, Integer> {

@Override
public String getDataSourceFactoryName(Integer uid) {
	if (uid == ServiceConstant.PEOPLE_ID_PT) {
		return "pt";
	} else {
		return "od" + uid % 3;
	}
}

@Override
public String getTargetTable(String table, Integer uid) {
	if (uid == ServiceConstant.PEOPLE_ID_PT) {
		return table + "_" + "platform";
	} else {
		return table + "_" + uid % 10;
	}
}

}`

如何使用like?

"#if(:1 != '' && :1 != null ) AND group_name like '%#{:1}%' #end "

该框架不认为在单引号里面的是一个变量 #{:1}

SQL中有中文导致报TokenMgrError: Lexical error

在注解的SQL中有一个单引号引的中文,启动项目时(还未调用接口)报错
org.jfaster.mango.parser.TokenMgrError: Lexical error at line 1, column 35. Encountered: "\u4e2d" (20013), after : "'"
at org.jfaster.mango.parser.ParserTokenManager.getNextToken(ParserTokenManager.java:1443)
at org.jfaster.mango.parser.Parser.jj_ntk(Parser.java:1374)
at org.jfaster.mango.parser.Parser.parse(Parser.java:28)
at org.jfaster.mango.parser.SqlParser.parse(SqlParser.java:26)
at org.jfaster.mango.operator.OperatorFactory.getOperator(OperatorFactory.java:68)
at org.jfaster.mango.operator.Mango$MangoInvocationHandler$1.load(Mango.java:301)
at org.jfaster.mango.operator.Mango$MangoInvocationHandler$1.load(Mango.java:291)
at org.jfaster.mango.util.local.DoubleCheckCache.get(DoubleCheckCache.java:41)
at org.jfaster.mango.operator.Mango$MangoInvocationHandler.getOperator(Mango.java:335)
at org.jfaster.mango.operator.Mango.create(Mango.java:196)
at org.jfaster.mango.plugin.spring.AbstractMangoFactoryBean.getObject(AbstractMangoFactoryBean.java:40)

尝试将中文用Unicode编码,添加了反斜杠转义(‘\\’),后返回编码后的代码,怎么样才能返回中文

mango 可以强制使用jdbc的批量更新吗

需要注意的是,mango内部有两种批量更新的实现,如果批量更新在同一个数据源的同一张表上完成,mango会使用jdbc原生的批量更新方法,否则mango会在内部进行循环更新。

mango内部循环更新太慢了,还有其他解决办法吗

读操作从主库读取,usemaster注解没有起作用

jfaster的版本:jfaster.16.1
代码如下:
@Sql("select * from order")
@Usemaster
List getOrders(@ShardingBy("peopleId") OrderSearchForm orderSearchForm);

发现使用usemaster注解后,发现第一次查询,没有更新的字段,猜测还是从库查询,但等待两秒查询后,查询的数据有更新的新内容,从库同步主库数据。

请问下:usemaster的用法是否正确,1.6.1版本是否能正常使用usermaster?
谢谢!

mysql d递归查询语法解析存在问题

String sql ="SELECT N_ID FROM(SELECT @ids AS _ids,( SELECT @ids := GROUP_CONCAT( N_ID ) FROM T_DEPARTMENT" +
" WHERE FIND_IN_SET( N_PARENT_ID, @ids ) ) AS cids," +
"@l := @l + 1 AS LEVEL FROM T_DEPARTMENT,( SELECT @ids :="+id+" , @l := 0 ) b WHERE @ids IS NOT NULL) ID," +
"T_DEPARTMENT DATA WHERE FIND_IN_SET( DATA.N_ID, ID._ids ) ";
1::=符号解析错误
2:是否支持原始sql语句传递,可以指定放行的sql

mango 批量插入问题

`public static void main(String[] args) {
long s = System.currentTimeMillis();
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/mango_example";
String username = "root"; // 这里请使用您自己的用户名
String password = "123456"; // 这里请使用您自己的密码
DataSource ds = new DriverManagerDataSource(driverClassName, url, username, password);
Mango mango = Mango.newInstance(ds); // 使用数据源初始化mango
FruitDao dao = mango.create(FruitDao.class);
List list = new ArrayList<>();
for (int i = 0; i < 2000; i++) {
list.add(new Fruit("xxx" + i, i));
}
dao.add(list);

	System.out.println(":" + (System.currentTimeMillis() - s)); //:1m29s
}`

@DB interface FruitDao { @SQL("insert into fruit(name, num) values(:name, :num)") public int add(List<Fruit> list); }

根据官网的例子,批量插入需要1分29秒, 批量插入2000条。如果加上事物就是2秒,这是为啥?

Transaction tx = TransactionFactory.newTransaction(); dao.add(list); tx.commit();

关于if语句的使用

if判断null是#if(:1 != null) 还是#if(:1)
还有#if(:1!= null) {} 后面是可以使用花括号的吗,这块文档太少了

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.