本文将带您了解关于强制Arc>>>>到Arc>>>>将不起作用的新内容,另外,我们还将为您提供关于.MySQLTransactionRollbackException:Lockwaittimeoute
本文将带您了解关于强制 Arc
- 强制 Arc
>>>> 到 Arc >>>> 将不起作用 - .MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
- .net – Option Strict和Option Explicit有什么作用?
- Add-Migration Init,Option ''trusted_connection'' not supported.
- c# – Braintree API在Sandbox中的CreateCard.Create上抛出Braintree.Exceptions.AuthorizationException
强制 Arc>>>> 到 Arc>>>> 将不起作用
我试图在里面存储一个 dyn 特征Arc<Mutex<Option<Box<>>>>>
,但是由于某种原因它不起作用
use std::sync::{Arc, Mutex};trait A{}struct B{}impl A for B{}struct H{ c: Arc<Mutex<Option<Box<dyn A>>>>}fn main() { let c = Arc::new(Mutex::new(Some(Box::new(B{})))); H{ c: c };}
错误:
error[E0308]: mismatched types --> src/main.rs:17:12 |17 | c: c | ^ expected trait object `dyn A`, found struct `B` | = note: expected struct `Arc<Mutex<Option<Box<(dyn A + ''static)>>>>` found struct `Arc<Mutex<Option<Box<B>>>>`
看起来它不能将 a 存储dyn
为 a Box<B>
,这很奇怪,因为它有效:
fn main() { let c: Arc<Mutex<Option<Box<dyn A>>>> = Arc::new(Mutex::new(Some(Box::new(B{}))));}
有什么不同?
答案1
有什么不同?
Box
和其他标准库类型有一个非常特殊的情况,它们可以包含动态大小的值,如dyn A
.
let c = Arc::new(Mutex::new(Some(Box::new(B{}))));H { c: c };
在此代码中,您已将变量c
(没有类型声明)初始化为类型推断为 的值Arc<Mutex<Option<Box<B>>>
,然后尝试将其存储在类型为 的字段中Arc<Mutex<Option<Box<dyn A>>>
。这是行不通的,因为这两种类型具有不同的内存布局。
let c: Arc<Mutex<Option<Box<dyn A>>>> = Arc::new(Mutex::new(Some(Box::new(B{}))));
在这段代码中,你已经给c
一个类型声明,作为结果,其中需要dyn
知道在哪里的建造点,这使得胁迫很快发生,你可以强迫一个Box<B>
到Box<dyn A>
的,因为Box
实现了特殊的特质CoerceUnsized
. (相同的机制适用于转换&B
为&dyn A
。)但是,这不适用于包含a 的任意类型Box<B>
——甚至不适用Option<Box<B>>
,更不用说更复杂的类型了。
你可以c
在构造它时给出一个类型:
let c: Arc<Mutex<Option<Box<dyn A>>>> = Arc::new(Mutex::new(Some(Box::new(B{}))));H { c: c };
或者,稍微短一点但更奇怪,您可以只Box
用它需要的类型注释 的直接容器:
let c = Arc::new(Mutex::new(Some::<Box<dyn A>>(Box::new(B{}))));H { c: c };
或者您可以使用as
运算符编写显式强制:
let c = Arc::new(Mutex::new(Some(Box::new(B{}) as Box<dyn A>)));H { c: c };
.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_191]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_191]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_191]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_191]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3188) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.wall.WallFilter.preparedStatement_executeQuery(WallFilter.java:648) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:181) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227) [druid-1.1.14.jar:1.1.14]
at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:96) [quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:113) [quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3842) [quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggersFired(JobStoreSupport.java:2962) [quartz-2.3.0.jar:na]
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:353) [quartz-2.3.0.jar:na]
2019-05-13 14:39:03.953 ERROR 10652 --- [SchedulerThread] druid.sql.Statement : {conn-1010019, pstmt-1020072} execute error. SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME = ''RASScheduler'' AND LOCK_NAME = ? FOR UPDATE
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_191]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_191]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_191]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_191]
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:952) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2530) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2683) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2486) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1966) ~[mysql-connector-java-5.1.46.jar:5.1.46]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3188) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.wall.WallFilter.preparedStatement_executeQuery(WallFilter.java:648) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:181) [druid-1.1.14.jar:1.1.14]
at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227) [druid-1.1.14.jar:1.1.14]
at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:96) [quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:113) [quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3842) [quartz-2.3.0.jar:na]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggersFired(JobStoreSupport.java:2962) [quartz-2.3.0.jar:na]
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:353) [quartz-2.3.0.jar:na]
2019-05-13 14:39:56.001 ERROR 10652 --- [SchedulerThread] druid.sql.Statement : {conn-1010019, pstmt-1020073} execute error. SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME = ''RASScheduler'' AND LOCK_NAME = ? FOR UPDATE
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_191]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_191]
.net – Option Strict和Option Explicit有什么作用?
Typos… Just use option strict and explicit please.. during one software development project,which I was on as a consultant,they were getting ridiculous amounts of errors everywhere… turned out the developer Couldn’t spell and would declare variables with incorrect spelling.. no big deal,until you use the correct spelling when you’re assigning a value to it… and you had option explicit off. Ouch to them…”
什么是选项严格和选项显式?我已经google了它,但不能得到的想法(因为大多数是Visual Basic,我做PHP)。
选项严格“将隐式数据类型转换限制为仅扩大转换”。请参见here.启用此选项后,您不能意外地将一种数据类型转换为不太精确的另一种数据类型(例如,从整数到字节)。同样,默认情况下应打开的选项。
Add-Migration Init,Option ''trusted_connection'' not supported.
问题:
本人使用Abp创建项目 Add-Migration Init,更改数据库连接方式为mysql时,重新初始化Migration时出现Option ''trusted_connection'' not supported.错误
System.ArgumentException: Option ''trusted_connection'' not supported.
at MySql.Data.MySqlClient.MySqlConnectionStringOption.GetOptionForKey(String key) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnectionStringBuilder.cs:line 452
at MySql.Data.MySqlClient.MySqlConnectionStringBuilder.set_Item(String key, Object value) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnectionStringBuilder.cs:line 354
at System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(String value)
at MySql.Data.MySqlClient.MySqlConnectionStringBuilder..ctor(String connectionString) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnectionStringBuilder.cs:line 19
at Microsoft.EntityFrameworkCore.MySqlDbContextOptionsExtensions.UseMySql(DbContextOptionsBuilder optionsBuilder, String connectionString, Action`1 mySqlOptionsAction)
at Microsoft.EntityFrameworkCore.MySqlDbContextOptionsExtensions.UseMySql[TContext](DbContextOptionsBuilder`1 optionsBuilder, String connectionString, Action`1 mySqlOptionsAction)
原因:修改appsettings.json数据库连接文件ConnectionStrings不彻底
解决:
ctrl+f,查找所有自己创建项目时默认的数据库连接语句,看看哪个没有改,修改后重试
c# – Braintree API在Sandbox中的CreateCard.Create上抛出Braintree.Exceptions.AuthorizationException
这是我为Braintree构建的一个简单的包装器:
public class PaymentBL { private static BraintreeGateway _braintreeGateway = new BraintreeGateway { Environment = Braintree.Environment.SANDBox,MerchantId = "xxxxxxx",PublicKey = "xxxxxxxxxxxx",PrivateKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }; public Result<Transaction> ChargeCardOnce(decimal amount,string cardholderName,string cardNumber,string expiration,string cvv) { TransactionCreditCardRequest creditCardRequest = new TransactionCreditCardRequest(); creditCardRequest.CardholderName = cardholderName; creditCardRequest.Number = cardNumber; creditCardRequest.ExpirationDate = expiration; creditCardRequest.CVV = cvv; TransactionoptionsRequest optionsRequest = new TransactionoptionsRequest(); optionsRequest.SubmitForSettlement = true; TransactionRequest transactionRequest = new TransactionRequest(); transactionRequest.Amount = amount; transactionRequest.CreditCard = creditCardRequest; transactionRequest.Options = optionsRequest; return _braintreeGateway.Transaction.Sale(transactionRequest); } /// <summary> /// Stores a credit card in the Braintree vault. In some cases,will put a $1 temporary charge /// on the credit card that will come off a few days later. /// /// From BrainTree: Regardless of card type,any instance where a $1 authorization returns a successful result,/// we immediately follow-up with an automatic void request to ensure that the transaction will fall off /// of the cardholder's statement as soon as possible. /// </summary> public Result<CreditCard> StoreCustomer(int customerId,string cvv) { //CreditCardAddressRequest addressRequest = new CreditCardAddressRequest(); //addressRequest.PostalCode = postalCode; CreditCardOptionsRequest optionsRequest = new CreditCardOptionsRequest(); optionsRequest.VerifyCard = true; optionsRequest.VerificationMerchantAccountId = _braintreeGateway.MerchantId; CreditCardRequest creditCard = new CreditCardRequest(); creditCard.CustomerId = customerId.ToString(); creditCard.Token = customerId.ToString(); // Use same token to ensure overwrite creditCard.CardholderName = cardholderName; creditCard.Number = cardNumber; creditCard.ExpirationDate = expiration; creditCard.CVV = cvv; creditCard.Options = optionsRequest; return _braintreeGateway.CreditCard.Create(creditCard); } /// <summary> /// Search BrainTree vault to retrieve credit card /// </summary> /// <param name="customerId"></param> public CreditCard GetCreditCardOnFile(int customerId) { Customer customer = null; try { customer = _braintreeGateway.Customer.Find(customerId.ToString()); } catch (Braintree.Exceptions.NotFoundException) { return null; } if (customer.CreditCards == null || customer.CreditCards.Length == 0) { return null; } if (customer.CreditCards.Length >= 2) { throw new Exception(string.Format("Customer {0} has {1} credit cards",customerId,customer.CreditCards.Length)); } return customer.CreditCards[0]; } }
当我调用这个方法时,它可以工作:
Result<Transaction> result = paymentBL.ChargeCardOnce( 2.34m,formCollection["name"],formCollection["number"],formCollection["exp"],formCollection["cvv"] );
随后,我可以在Braintree仪表板中查看已完成的测试事务.因此,我知道Braintree.js的加密表单值正确地到达我的控制器操作,并且我的密钥和商家帐户ID都已正确设置.
当我使用以下对StoreCustomer的调用将上述调用替换为ChargeCardOnce时,我在返回_braintreeGateway.CreditCard.Create(creditCard)行返回Braintree.Exceptions.AuthorizationException;
Result<CreditCard> result = paymentBL.StoreCustomer( systemHost.Customer.CustomerId,formCollection["cvv"] );
来自Braintree的支持:“您可以在沙箱中创建客户和信用卡,因为它的构建完全反映了生产环境的样子.”
有没有人经历过这个?我指的是Braintree对这个问题的支持,但是如果SO上的任何人看到了这个问题并且知道解决方案或解决方法,我会很放心.
解决方法
在这种情况下,问题是:
optionsRequest.VerificationMerchantAccountId = _braintreeGateway.MerchantId;
您的商家ID标识了您的付款网关帐户,而您的商家帐户ID标识了您要用于验证的银行帐户. An article in our support center explains the difference:
MerchantAccountId
With Braintree,you can have multiple merchant
accounts all processing via the same gateway account. This
means that you can have multiple locations,multiple businesses,
multiple currencies,etc. all setup and processing under a single
account. This makes it easy to keep track of all of your processing
via unified reporting and access and can even save you money.You can find the IDs for all merchant accounts in your gateway
account by following these steps:
login to your account
hover over your account name
and click “Processing”scroll to the bottom of the page to the
section labeled “Merchant Accounts”.
AuthorizationException是HTTP Status Code 403 Forbidden.这意味着服务器正在拒绝您的请求,因为您没有访问资源的权限(即使您可能已经过身份验证).
由于您的用户没有可以使用您指定的ID的商家帐户(因为它根本不是商家帐户ID),因此您将获得AuthorizationException.
如果通常情况下,您的商家只有一个商家帐户,或者您想使用默认帐户,则无需指定VerificationMerchantAccountId.
关于强制 Arc
本文标签: