· 9 years ago · May 02, 2017, 11:08 AM
1import org.hibernate.SQLQuery;
2import org.hibernate.Session;
3import org.hibernate.SessionFactory;
4import org.hibernate.Transaction;
5import org.hibernate.cfg.Configuration;
6
7import java.math.BigInteger;
8import java.util.Properties;
9import java.util.Random;
10import java.util.UUID;
11import java.util.concurrent.ExecutorService;
12import java.util.concurrent.Executors;
13
14public class UUIDTest {
15 static SessionFactory sessionFactory ;
16 static Random random = new Random();
17
18 static {
19 Properties properties = new Properties();
20 properties.put("hibernate.dialect","org.hibernate.dialect.MySQLDialect");
21 properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
22 properties.put("hibernate.connection.url", "jdbc:mysql://localhost:3306/flux");
23 properties.put("hibernate.connection.username", "root");
24 properties.put("hibernate.connection.password", "");
25 properties.put("hibernate.current_session_context_class", "managed");
26 properties.put("connection.provider_class", "org.hibernate.c3p0.internal.C3P0ConnectionProvider");
27 properties.put("hibernate.c3p0.min_size", 10);
28 properties.put("hibernate.c3p0.max_size", 100);
29
30 Configuration configuration = new Configuration().addProperties(properties);
31 sessionFactory = configuration.buildSessionFactory();
32 }
33
34 public static void main(String[] args) {
35 int out = Integer.parseInt(args[0]);
36 int end = Integer.parseInt(args[1]);
37 System.out.println("Starting test");
38
39 ExecutorService exSvc = Executors.newFixedThreadPool(100);
40 for (int j = 0; j < out; j++) {
41 for (int i = 0; i < end; i++) {
42 final int a = j;
43 final int b = i;
44 exSvc.submit(() -> insert(a, b));
45 }
46 }
47
48// sessionFactory.close();
49 }
50
51 public static void insert(int j, int i) {
52 System.out.println(j+"-"+i);
53 Session session = sessionFactory.openSession();
54 Transaction transaction = session.getTransaction();
55 transaction.begin();
56
57 String smId = UUID.randomUUID().toString();
58 SQLQuery query1 = session.createSQLQuery("insert into StateMachines (id, name, version) values (:id, :name, :version);");
59 query1.setParameter("name", "sm_name-1");
60 query1.setParameter("version", "1");
61 query1.setParameter("id", smId);
62 query1.executeUpdate();
63
64 SQLQuery query2 = session.createSQLQuery("insert into States (name, version, stateMachineId, status) values (:name, :version, :smId, :status);");
65 query2.setParameter("name", "task-1");
66 query2.setParameter("version", 1);
67 query2.setParameter("smId", smId);
68 query2.setParameter("status", "initialized");
69 query2.executeUpdate();
70
71 Long task1 = ((BigInteger) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
72
73 SQLQuery query3 = session.createSQLQuery("insert into States (name, version, stateMachineId, status) values (:name, :version, :smId, :status);");
74 query3.setParameter("name", "task-2");
75 query3.setParameter("version", 1);
76 query3.setParameter("smId", smId);
77 query3.setParameter("status", "initialized");
78 query3.executeUpdate();
79
80 Long task2 = ((BigInteger) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
81
82 SQLQuery query4 = session.createSQLQuery("insert into Events (name, type, stateMachineInstanceId, status) values (:name, :type, :smId, :status);");
83 query4.setParameter("name", "event-1");
84 query4.setParameter("type", "type-1");
85 query4.setParameter("smId", smId);
86 query4.setParameter("status", "pending");
87 query4.executeUpdate();
88
89 Long event1 = ((BigInteger) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
90
91 SQLQuery query5 = session.createSQLQuery("insert into Events (name, type, stateMachineInstanceId, status) values (:name, :type, :smId, :status);");
92 query5.setParameter("name", "event-2");
93 query5.setParameter("type", "type-2");
94 query5.setParameter("smId", smId);
95 query5.setParameter("status", "pending");
96 query5.executeUpdate();
97
98 Long event2 = ((BigInteger) session.createSQLQuery("SELECT LAST_INSERT_ID()").uniqueResult()).longValue();
99
100 SQLQuery query6 = session.createSQLQuery("insert into AuditRecords (stateMachineInstanceId, stateId, stateStatus) values (:smId, :sId, :status);");
101 query6.setParameter("smId", smId);
102 query6.setParameter("sId", random.nextInt(100));
103 query6.setParameter("status", "test-status");
104 query6.executeUpdate();
105
106 SQLQuery query7 = session.createSQLQuery("insert into AuditRecords (stateMachineInstanceId, stateId, stateStatus) values (:smId, :sId, :status);");
107 query7.setParameter("smId", smId);
108 query7.setParameter("sId", random.nextInt(100));
109 query7.setParameter("status", "test-status");
110 query7.executeUpdate();
111
112 transaction.commit();
113 session.close();
114
115
116 // do updates
117 Session session1 = sessionFactory.openSession();
118 Transaction transaction1 = session1.getTransaction();
119 transaction1.begin();
120
121 SQLQuery query12 = session1.createSQLQuery("update Events set status=:status where id=:id");
122 query12.setString("status", "triggered");
123 query12.setLong("id", event1);
124 query12.executeUpdate();
125
126 SQLQuery query13 = session1.createSQLQuery("update Events set status=:status where id=:id");
127 query13.setString("status", "triggered");
128 query13.setLong("id", event2);
129 query13.executeUpdate();
130
131 SQLQuery query8 = session1.createSQLQuery("update States set status=:status where id=:id");
132 query8.setString("status", "running");
133 query8.setLong("id", task1);
134 query8.executeUpdate();
135
136 SQLQuery query9 = session1.createSQLQuery("update States set status=:status where id=:id");
137 query9.setString("status", "running");
138 query9.setLong("id", task2);
139 query9.executeUpdate();
140
141 SQLQuery query14 = session1.createSQLQuery("insert into AuditRecords (stateMachineInstanceId, stateId, stateStatus) values (:smId, :sId, :status);");
142 query14.setParameter("smId", smId);
143 query14.setParameter("sId", task1);
144 query14.setParameter("status", "running");
145 query14.executeUpdate();
146
147 SQLQuery query15 = session1.createSQLQuery("insert into AuditRecords (stateMachineInstanceId, stateId, stateStatus) values (:smId, :sId, :status);");
148 query15.setParameter("smId", smId);
149 query15.setParameter("sId", task2);
150 query15.setParameter("status", "running");
151 query15.executeUpdate();
152
153 SQLQuery query10 = session1.createSQLQuery("update States set status=:status where id=:id");
154 query10.setString("status", "completed");
155 query10.setLong("id", task1);
156 query10.executeUpdate();
157
158 SQLQuery query16 = session1.createSQLQuery("insert into AuditRecords (stateMachineInstanceId, stateId, stateStatus) values (:smId, :sId, :status);");
159 query16.setParameter("smId", smId);
160 query16.setParameter("sId", task1);
161 query16.setParameter("status", "completed");
162 query16.executeUpdate();
163
164 SQLQuery query11 = session1.createSQLQuery("update States set status=:status where id=:id");
165 query11.setString("status", "completed");
166 query11.setLong("id", task2);
167 query11.executeUpdate();
168
169 SQLQuery query17 = session1.createSQLQuery("insert into AuditRecords (stateMachineInstanceId, stateId, stateStatus) values (:smId, :sId, :status);");
170 query17.setParameter("smId", smId);
171 query17.setParameter("sId", task2);
172 query17.setParameter("status", "completed");
173 query17.executeUpdate();
174
175 transaction1.commit();
176 session1.close();
177
178 }
179}
180
181====================================================================================================
182Tables:
183----------------------------------------------------------------------------------------------------
184CREATE TABLE IF NOT EXISTS `StateMachines` (
185 `id` VARCHAR(64) NOT NULL,
186 `name` VARCHAR(1000) NOT NULL,
187 `version` SMALLINT UNSIGNED NOT NULL,
188 `description` VARCHAR(10) DEFAULT NULL,
189 `createdAt` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
190 `updatedAt` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
191 PRIMARY KEY (`id`)
192)
193ENGINE=InnoDB
194ROW_FORMAT=DEFAULT
195DEFAULT CHARSET=utf8
196AUTO_INCREMENT=1;
197----------------------------------------------------------------------------------------------------
198CREATE TABLE IF NOT EXISTS `States` (
199 `id` BIGINT NOT NULL AUTO_INCREMENT,
200 `name` VARCHAR(255) NOT NULL,
201 `version` SMALLINT UNSIGNED NOT NULL,
202 `description` VARCHAR(10) DEFAULT NULL,
203 `dependencies` VARCHAR(1000) DEFAULT NULL,
204 `stateMachineId` VARCHAR(64) DEFAULT NULL,
205 `onEntryHook` varchar(500) DEFAULT NULL,
206 `task` VARCHAR(1000) DEFAULT NULL,
207 `onExitHook` varchar(500) DEFAULT NULL,
208 `outputEvent` varchar(500) DEFAULT NULL,
209 `retryCount` INT UNSIGNED DEFAULT 0,
210 `timeout` INT UNSIGNED DEFAULT NULL,
211 `status` varchar(50) DEFAULT NULL,
212 `rollbackStatus` varchar(50) DEFAULT NULL,
213 `attemptedNoOfRetries` INT UNSIGNED DEFAULT 0,
214 `createdAt` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
215 `updatedAt` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
216 PRIMARY KEY (`id`),
217 CONSTRAINT `FK_sm_states` FOREIGN KEY (`stateMachineId`) REFERENCES `StateMachines` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
218)
219ENGINE=InnoDB
220ROW_FORMAT=DEFAULT
221DEFAULT CHARSET=utf8
222AUTO_INCREMENT=1;
223----------------------------------------------------------------------------------------------------
224CREATE TABLE IF NOT EXISTS `Events` (
225 `id` BIGINT NOT NULL AUTO_INCREMENT,
226 `name` VARCHAR(255) NOT NULL,
227 `type` VARCHAR(100) NOT NULL,
228 `status` VARCHAR(50) DEFAULT NULL,
229 `stateMachineInstanceId` VARCHAR(64) NOT NULL,
230 `eventData` BLOB,
231 `eventSource` VARCHAR(100) DEFAULT NULL,
232 `createdAt` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3),
233 `updatedAt` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
234 PRIMARY KEY (`id`),
235 UNIQUE KEY (`stateMachineInstanceId`, `name`),
236 CONSTRAINT `FK_sm_events` FOREIGN KEY (`stateMachineInstanceId`) REFERENCES `StateMachines` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
237)
238ENGINE=InnoDB
239ROW_FORMAT=DEFAULT
240DEFAULT CHARSET=utf8
241AUTO_INCREMENT=1;
242----------------------------------------------------------------------------------------------------
243CREATE TABLE IF NOT EXISTS `AuditRecords` (
244 `id` BIGINT NOT NULL AUTO_INCREMENT,
245 `stateMachineInstanceId` VARCHAR(64) NOT NULL,
246 `stateId` BIGINT NOT NULL,
247 `retryAttempt` INT UNSIGNED DEFAULT NULL,
248 `stateStatus` VARCHAR(50) DEFAULT NULL,
249 `stateRollbackStatus` VARCHAR(50) DEFAULT NULL,
250 `errors` VARCHAR(1000) DEFAULT NULL,
251 `createdAt` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
252 PRIMARY KEY (`id`),
253 KEY `index_audit_on_SM_instance_id` (`stateMachineInstanceId`)
254)
255ENGINE=InnoDB
256ROW_FORMAT=DEFAULT
257DEFAULT CHARSET=utf8
258AUTO_INCREMENT=1;